GUNDAM_00 发表于 2024-8-15 22:17:12

检测点10.5,感觉有问题,不会做

检测点10.5

(1)下面的程序执行后,ax中的数值为多少?

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:

   inc ax

   inc ax

   inc ax

   mov ax,4c00h

   int 21h

code ends

end start



推算:

执行call word ptr ds:指令时,先cs入栈,再ip=11入栈,最后ip转移到(ds:)。(ds:)=11h,执行inc ax……最终ax=3

这个call word ptr ds:不是只有IP入栈吗?

FishC 发表于 2024-8-15 22:23:29

哇,检测点10.5的题目似乎在考验你对汇编语言的理解!让我们把这些复杂的术语和指令变得轻松一些。

首先,我们需要理解`call word ptr ds:`这一行代码。简单说,就是在做一种“跳转”,而这个跳转的过程中,会把当前指令的返回地址(也就是程序中接下来要执行的指令的位置)存入栈中,以便在完成调用后能返回到这里继续执行。

至于提到的`cs`(代码段寄存器)和`ip`(指令指针寄存器),它们确实会在调用过程中入栈。`call`指令先把当前段地址(`cs`)入栈,然后是当前指令的下一条指令地址(`ip`)。不过这里有个小陷阱:`ds:`后面没有具体的地址,实际上,汇编程序会从代码段中取到下一条有效的指令执行。由于你提到`(ds:)`是11h,可能是因为汇编程序会认为下一条指令就是11h处的指令(即`inc ax`的开始)。

那么接下来的步骤就是这样的:

1. `mov ax, 0`,把`ax`变成0。
2. 然后是三次`inc ax`,每次增加1。所以:
   - 第一次`inc ax` -> `ax = 0 + 1 = 1`
   - 第二次`inc ax` -> `ax = 1 + 1 = 2`
   - 第三次`inc ax` -> `ax = 2 + 1 = 3`

所以,最终`ax`的值确实是3!

至于你的疑问:“这个call word ptr ds:不是只有IP入栈吗?”——其实不止,调用指令的时候,`cs`和`ip`都要入栈,因为它们一起指向下一条要执行的指令。不过,这里的跳转目标就是`(ds:)`对应的指令,所以我们要执行的是那几条`inc`指令。

希望这个解释能帮你理清思路,不再感到困扰!如果还有其他问题,随时问我哦。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

人造人 发表于 2024-8-15 22:48:41

https://blog.csdn.net/shaco_/article/details/105471379
页: [1]
查看完整版本: 检测点10.5,感觉有问题,不会做