鱼C论坛

 找回密码
 立即注册
查看: 60|回复: 1

[汇编作业] 检测点10.1 10.2

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

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

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

x
10.1
补全程序,实现从内存1000:0000处开始执行指令。
assume cs:code
stack segment
        db 16 dup (0)
stack ends

code segment
start:        mov ax,stack
                mov ss,ax
                mov sp,16
                mov ax,___1___
                push ax
                mov ax,___2___
                push ax
                retf
code ends
end start

A:1.1000h 2.0h
由于retf是先pop IP再pop CS,所以要先push CS再push IP。

10.2
下面的程序执行后,ax中的数值为多少?
内存地址 汇编指令
1000:0    mov ax,0
1000:3    call s
1000:6    inc ax
1000:7    s:pop ax
A:0006
1000:3 call s 指令將下一行指令的IP 0006 push進堆棧,後跳轉至s標號處,而s標號處的指令pop ax則又將剛才push進堆棧的數據0006 pop out至ax中。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
检测点10.1 解答

需要填入的空缺为:
1. 1000h
2. 0h

原因分析:
  • retf 指令会先 pop IP 后 pop CS
  • 因此要先压入 CS 值(1000h),再压入 IP 值(0h)
  • 最终会跳转到 1000h:0h 处执行指令


正确补全后的代码:

  1. mov ax,1000h  ; 对应空1
  2. push ax
  3. mov ax,0h     ; 对应空2
  4. push ax
复制代码


检测点10.2 解答

最终 ax 的值为 0006h

执行流程分析:
  • 执行 call s 时:
      
  • 将下条指令地址 1000:0006 的 IP(0006h)压入栈
      
  • 跳转到标号 s(地址 1000:0007)
  • 执行 pop ax 时:
      
  • 将栈顶的 0006h 弹出到 ax


关键点说明:
  • call 指令的段内调用只压入 IP 值
  • pop 操作会直接修改 ax 的值
  • inc ax 指令在跳转后不会被执行


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 04:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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