汇编语言 复习 第十章(CALL和RET)
CALL和RET指令都是转移指令,其实我在上一章的复习应该加上的。
1.ret指令用栈中的数据,修改IP的内容,从而实现近转移,
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。
2.call指令
当执行CALL指令时,进行下面两步操作。
A.将当前(当前指的是CALL 标号的后面那个字节的IP)的IP或CS和IP压入栈中;
B.转移
检测点10.2
下面的程序执行后,ax中的数值为多少?
内存地址 机器码 汇编指令 执行后情况
1000:0 b8 00 00 mov ax,0 ax=0 ip指向1000:3
1000:3 e8 01 00 call s
1000:6 40 inc ax
1000:7 58 s:pop ax ax=6
用debug进行跟踪确认,“call 标号”是将该指令后的第一个字节偏移地址入栈,再转到标号处执行指令。
提示:在执行指令"call s"时,IP的值变为6,接着进栈。此时程序直接执行指令"s:pop ax",这就等于把栈中IP的值放入ax中。所以答案为6。
这一点是特别要说明的一点。在第10章的CALL指令中关于IP进栈的问题。事实上,在执行CALL指令时,IP的值先变成CALL指令后的第一个字节的偏移地址,然后才被压入栈。而作者的说法,很容易使读者(尤其是初学者)产生误解:会误以为被压入栈的IP的值是CALL指令的偏移地址。
检测点10.3
下面的程序执行后,ax中的数值为多少?
内存地址 机器码 汇编指令 执行后情况
1000:0 b8 00 00 mov ax,0 ax=0,ip指向1000:3
1000:3 9a 09 00 00 10 call far ptr s pop cs,pop ip,ip指向1000:9
1000:8 40 inc ax
1000:9 58 s:pop ax ax=8h
add ax,ax ax=10h
pop bx bx=1000h
add ax,bx ax=1010h
用debug进行跟踪确认,“call far ptr s”是先将该指令后的第一个字节段地址cs=1000h入栈,再将偏移地址ip=8h入栈,最后转到标号处执行指令。
出栈时,根据栈先进后出的原则,先出的为ip=8h,后出的为cs=1000h
顺便整理了下 汇编当中的乘法和除法