ziheng99 发表于 2013-7-18 10:41:51

检测点10.5

看图


logite 发表于 2013-7-18 10:41:52

应该是没有循环 因为call 是先将后一条指令的偏移入栈 所以0eh 处就是call后一条指令的偏移
也就是说call word ptr ds: call的就是inc ax这条指令。
本人也正在学 王爽的 汇编语言。不知道回答的对不对,希望对你有帮助。

logite 发表于 2013-7-18 19:02:54

在这里call命令第一次0eh是零但是把它后面一条指令的偏移进栈了   也就是 inc ax这条指令的偏移放到了0eh,                  所以循环到第二次call的也就是这条指令。

Dardy 发表于 2013-7-18 19:58:29

call 先把 inc ax 偏移地址压栈
然后 跳转到ds:执行一句,经过上句的压栈,ds:已是inc ax的偏移地址了,所以会执行一句inc ax,再返回Call的下一句执行。

整个过程,inc ax执行的次数,比代码中书写的inc ax数,多一次。

小号4 发表于 2013-7-18 22:57:17

来看看,学习了

刀下留人 发表于 2013-7-19 02:40:02

都是高手啊!

刀下留人 发表于 2013-7-19 02:41:40

谁有时间解释下!

忘忧的记忆 发表于 2013-7-19 08:39:17

不是很懂,

一个人的精彩 发表于 2013-7-19 10:45:25

这段代码,SS段和DS段是同一个段, call word ptr ds:执行时,将inc ax这段代码的ip压入栈中,这时(sp)=(sp)-2,执行后,jmp word ptr ds:,ds:=((ss)*16+(sp))=ss:,所以跳到inc ax继续执行。

刀下留人 发表于 2013-7-20 00:09:45

厉害啊!!!!

刀下留人 发表于 2013-7-20 00:13:01

能不能解释下图的意思

小9 发表于 2013-9-15 10:40:13

只是把CALL后一句的IP压入栈

H.FF 发表于 2015-8-24 22:06:03

我被这个困惑了好久

爱上小刺猬 发表于 2016-1-13 13:33:35

{:10_256:}{:10_256:}四楼说的不错 不过答案没有多一次,只是将call后面inc ax的IP压入栈中,然后jmp过去跳到栈中找要跳的地址,还是那个call后面Inc ax的IP,又回来了

ziheng99 发表于 2016-1-19 21:10:23

12123

huanglanting 发表于 2016-5-10 13:07:07

assume cs:code
      stack segment   ;定义栈段
      dw 8 dup (0)    ;16个字节
      stack ends
      code segment

      start:mov ax,stack
                mov ss,ax
                mov sp,16   ;栈初始化
                mov ds,ax   ;数据段和栈段是同一段空间
                mov ax,0       ;ax=0
                call word ptr ds:;把下一条指令的cs和ip压入栈空间sp=0eh cs入栈 然后ip入栈
                                       ;call后把cs 和ip还原 等同于call到下一条指令执行
                inc ax      ;ax=1
                inc ax       ;ax=2
                inc ax      ;ax=3

                mov ax,4c00h
                int21h      ;程序正常结束ax的值为3
页: [1]
查看完整版本: 检测点10.5