注册 登录
编程论坛 汇编论坛

____xyz call 指令问题

admin_xyz 发布于 2012-09-29 09:12, 601 次点击
程序代码:
assume cs:code, ss:stack

stack segment
    dw  0,0,0,0,0,0,0,0
stack ends

code segment
    start:
        mov     ax, 0       ;0,1,2
        call    far ptr s   ;3,4,5,6,7    前面共占7字节,可是call后栈中的IP却为8.为什么.?  

        ;call指令相当于push cs , push ip , jmp far ptr 标号.        
        ;也就是说会把当前cs,ip压入栈中,可为什么ip入栈后是8...      = =#怎么感觉这个问题这么弱智。。。

        inc     ax
    s    :
        pop     ax
        add     ax, ax
        pop     bx
        add     ax, bx

        mov     ax, 4c00h
        int     21h


code ends

end start

7 回复
#2
zklhp2012-09-29 09:18
压栈和ip值的改变有关系么 压栈改的是sp
#3
admin_xyz2012-09-29 09:33

        call指令
        相当于push cs
        push ip ,
        jmp far ptr 标号.

 我只是奇怪为什么ip入栈是8
#4
zklhp2012-09-29 09:47
以下是引用admin_xyz在2012-9-29 09:33:16的发言:


        call指令
        相当于push cs
        push ip ,
        jmp far ptr 标号.

 我只是奇怪为什么ip入栈是8

压栈压的是下一条指令 所以这里call压的是inc那个对应的ip 也就是8
#5
有容就大2012-09-29 11:38
以下是引用zklhp在2012-9-29 09:47:48的发言:


压栈压的是下一条指令 所以这里call压的是inc那个对应的ip 也就是8

说到点子上了 对一条指令分两个动作 读取 + 执行。
比如说 mov ax, 0 读取后ip 要自动增加指向下一条指令, 但是mov ax, 0 的执行不会影响ip
的值 所以继续读取ip指向的指令。
但是 如果读取的是跳转指令 如jmp 等 那么在读取它后 ip仍然自动增加指向下一条指令 但是在jmp指令
的执行是会改变ip的 所以程序按jmp指令的要求把CS, IP入栈后再改变ip的值,也就是说此时入栈的ip是
jmp指令的下一条指令的ip  而不是跳转后的指令的ip.
不知道我这个理解有没错 。。。
#6
zklhp2012-09-29 11:50
一个东西 书上看了 只是看了 一用 还是会错 一见到 还是不会 没关系 多多来几次就好了 学习怕的是重复 祝楼主成功

顺便催一下结题的事
#7
admin_xyz2012-09-29 21:06
回复 5楼 有容就大
谢谢了,差不多明白了。
#8
lxq69668922012-10-24 13:08
学习了
1