1.问题:以下指令执行完后,ax的值?
内存地址 机器码 汇编指令 执行后情况
1000:0 b8 00 00 mov ax,0 ; ax=0 ip指向1000:3
1000:3 e8 01 00 call s ; pop ip ip指向1000:7
1000:6 40 inc ax
1000:7 58 s:pop ax ; ax=6
用debug进行跟踪确认,“call 标号”是将该指令后的第一个字节偏移地址入栈,再转到标号处执行指令?
2.答案: 6
首先,你要明确有关CS:IP 的一些问题:1. CS:IP存储的是代码的地址,这个地址指向即将执行的代码。2. 那么CS:IP在什么时候指向即将执行的代码呢?举例如下:mov ax,78H mov bx ,24H 当 mov ax,78H 指令被读取之前,CS:IP 是指向它本省的,读取之后,IP 的值自动增加,增加多少呢?答曰:是指令mov ax,78H的长度,所以IP值自动增加后CS:IP指向下一条指令即:mov bx,24H。IP值自动增加之后,才执行本条指令(mov ax,78H)。3. 以你所说的例子进行分析:mov ax,0 call s inc ax s:pop ax 一共四条指令。执行完 mov ax,0 CS:IP=1000:3 读取指令 call s 后,CS:IP=1000:6也就是 指向 inc ax 指令的。
接下来,具体说说call s 指令的执行过程:上面说过,读取call s 指令后 CS:IP已经指向了 inc ax,可是我们现在不执行它,我们要跳转去执行用“s”标记的 pop ax 指令!!!于是call命令就先把当前执行的状态,也就是CS:IP值先存起来,放进栈中,到用的时候,再取出来(这里"取出来"可以理解为,恢复CS:IP的值,接着没有执行的往下继续执行!)。那这存起来的CS:IP 是多少呢?答曰:1000:6(指向 inc ax )所以这里的call s 指令相当于 push ip jmp near ptr s 即:把IP的值入栈,再跳转去执行s标记的pop ax 指令。
最后 是pop ax 指令的执行,我们根据上面可以知道在此指令之前IP入栈,所以出栈的是IP,并且把这个IP保存在ax 中,IP=6,所以ax=6。
其实就是函数调用时,将函数后的下一个语句的地址保存,然后调用函数。
内存地址 机器码 汇编指令 执行后情况
1000:0 b8 00 00 mov ax,0 ; ax=0 ip指向1000:3
1000:3 e8 01 00 call s ; pop ip ip指向1000:7
1000:6 40 inc ax
1000:7 58 s:pop ax ; ax=6
用debug进行跟踪确认,“call 标号”是将该指令后的第一个字节偏移地址入栈,再转到标号处执行指令?
2.答案: 6
首先,你要明确有关CS:IP 的一些问题:1. CS:IP存储的是代码的地址,这个地址指向即将执行的代码。2. 那么CS:IP在什么时候指向即将执行的代码呢?举例如下:mov ax,78H mov bx ,24H 当 mov ax,78H 指令被读取之前,CS:IP 是指向它本省的,读取之后,IP 的值自动增加,增加多少呢?答曰:是指令mov ax,78H的长度,所以IP值自动增加后CS:IP指向下一条指令即:mov bx,24H。IP值自动增加之后,才执行本条指令(mov ax,78H)。3. 以你所说的例子进行分析:mov ax,0 call s inc ax s:pop ax 一共四条指令。执行完 mov ax,0 CS:IP=1000:3 读取指令 call s 后,CS:IP=1000:6也就是 指向 inc ax 指令的。
接下来,具体说说call s 指令的执行过程:上面说过,读取call s 指令后 CS:IP已经指向了 inc ax,可是我们现在不执行它,我们要跳转去执行用“s”标记的 pop ax 指令!!!于是call命令就先把当前执行的状态,也就是CS:IP值先存起来,放进栈中,到用的时候,再取出来(这里"取出来"可以理解为,恢复CS:IP的值,接着没有执行的往下继续执行!)。那这存起来的CS:IP 是多少呢?答曰:1000:6(指向 inc ax )所以这里的call s 指令相当于 push ip jmp near ptr s 即:把IP的值入栈,再跳转去执行s标记的pop ax 指令。
最后 是pop ax 指令的执行,我们根据上面可以知道在此指令之前IP入栈,所以出栈的是IP,并且把这个IP保存在ax 中,IP=6,所以ax=6。
其实就是函数调用时,将函数后的下一个语句的地址保存,然后调用函数。