汇编语言 复习 第十章(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

顺便整理了下 汇编当中的乘法和除法

原文地址:https://www.cnblogs.com/Lee-geeker/p/3164002.html