Mautuor 发表于 2012-3-13 16:07:18

汇编检测点10.5

检测点10.5的第一小题,实在想不通ax为3是怎么得到的,请懂的朋友们解答一下,帮我解惑!谢谢。:lol

夏洛 发表于 2012-3-14 14:32:45

call word ptr 这条命令相当于执行push ip,jmp word ptr 内存单元地址
所以call word ptr ds:这条命令相当于执行push ip,jmp word ptr ds:,push ip把下一行的inc ax的ip地址放入到栈中,于是SP-2,word ptr ds:的内容就是inc ax的IP地址,然后在执行jmp,就跳回去了

zyt896 发表于 2013-8-12 16:32:55

9天 发表于 2013-8-13 22:53:30

夏洛 发表于 2012-3-14 14:32 static/image/common/back.gif
call word ptr 这条命令相当于执行push ip,jmp word ptr 内存单元地址
所以call word ptr ds:这条命 ...

这答案是容易让人明白些

monk-half 发表于 2013-8-14 03:52:12

没题目? 帮顶。{:5_109:}

狂潮丶 发表于 2013-8-14 16:20:11

本帖最后由 狂潮丶 于 2013-8-14 16:23 编辑

assume cs:code

stack segment

   dw 8 dup (0)

stack ends

code segment

start:   mov ax,stack

   mov ss,ax

   mov sp,16

   mov ds,ax

   mov ax,0

   call word ptr ds:      关键就在这里call word 是近转移那么就是把call指令后的第一个字节的ip压入栈也就是inc ax的ip。压入之后栈顶变为0eh,那么这句代码call word ptr ds:就是跳转到inc ax处然后执行三次inc ax程序结束!

   inc ax

   inc ax

   inc ax

   mov ax,4c00h

   int 21h

code ends

end start

huanglanting 发表于 2016-5-10 12:59:21

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

低手莫怪 发表于 2017-2-22 20:09:11

真的看得一脸郁闷
页: [1]
查看完整版本: 汇编检测点10.5