鱼C论坛

 找回密码
 立即注册
查看: 347|回复: 2

[已解决]检测点10.5,感觉有问题,不会做

[复制链接]
发表于 2024-8-15 22:17:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
检测点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:[0eh]

     inc ax

     inc ax

     inc ax

     mov ax,4c00h

     int 21h

code ends

end start



推算:

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

这个call word ptr ds:[0eh]不是只有IP入栈吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-15 22:48:41 | 显示全部楼层    本楼为最佳答案   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 20:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表