鱼C论坛

 找回密码
 立即注册
查看: 87|回复: 7

看小甲鱼的汇编,讲解王爽老师的书,请问如何编程检测点3.2

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

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

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

x
内容去下图
Screenshot_2025-04-20-13-52-32-353_com.baidu.netdisk-edit.jpg
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

根据王爽《汇编语言》检测点3.2的要求,需要完成栈空间初始化及数据转移操作。以下是关键实现步骤:


  1. mov ax, 1000H
  2. mov ss, ax      ; 设置栈段寄存器SS=1000H
  3. mov sp, 0010H    ; 设置栈顶指针SP=0010H(栈空时指向1000:0010)
  4. mov ax, 1000H
  5. mov ds, ax      ; 设置数据段DS=1000H

  6. push [0]        ; 将内存1000:0000的字数据压栈
  7. push [2]        ; 将内存1000:0002的字数据压栈
  8. pop  [2]        ; 弹出数据到1000:0002(完成数据交换)
  9. pop  [0]        ; 弹出数据到1000:0000(完成数据交换)
复制代码


  • 栈初始化原理:通过SS:SP=1000:0010建立空栈,栈空间范围为10000H~1000FH
  • 数据交换原理:利用栈LIFO特性,通过push/pop指令实现内存单元数据交换
  • 注意事项:不能直接用mov指令修改段寄存器(需通过通用寄存器中转)


建议在Debug中单步调试观察栈指针SP的变化及内存数据交换过程。

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

使用道具 举报

 楼主| 发表于 3 天前 From FishC Mobile | 显示全部楼层
最好讲解一下,
不明白这两块不同地址应该如何关联到一起处理
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 00:47 | 显示全部楼层
本帖最后由 jackz007 于 2025-4-21 13:29 编辑

        把数据段设置为 1000h,把堆栈段设置为 2000h并把栈顶指针设置为 010h,利用堆栈操作在压栈的时候,栈顶指针会由栈顶向栈底移动的特性,当把 ds:[0] 入栈时,会转存2个字节(1个word)到栈顶 ss:[e],当将 ds:[2] 入栈时,会转存2个字节(1个word)到栈顶 ss:[c],...... 依此类推,当把 ds:[e] 入栈时,会转存2个字节(1个word)到栈顶 ss:[0],从而达到了将 10000H-10010H 处的 8 个 word 依逆序保存到 20000H-20010H 的目的。
  1. assume cs : code
  2. code segment
  3. start: mov ax,1000h
  4.        mov ds,ax
  5.        mov ax,2000h            ; 填空第 1 行内容
  6.        mov ss,ax               ; 填空第 2 行内容
  7.        mov sp,10h              ; 填空第 3 行内容
  8.        push word ptr [0]       ; ds:[0]  --> ss:[e]
  9.        push word ptr [2]       ; ds:[2]  --> ss:[c]
  10.        push word ptr [4]       ; ds:[4]  --> ss:[a]
  11.        push word ptr [6]       ; ds:[6]  --> ss:[8]
  12.        push word ptr [8]       ; ds:[8]  --> ss:[6]
  13.        push word ptr [0ah]     ; ds:[a]  --> ss:[4]
  14.        push word ptr [0ch]     ; ds:[c]  --> ss:[2]
  15.        push word ptr [0eh]     ; ds:[e]  --> ss:[0]
  16.        mov ax,4c00h
  17.        int 21h
  18. code ends
  19. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 17:43 From FishC Mobile | 显示全部楼层
jackz007 发表于 2025-4-21 00:47
把数据段设置为 1000h,把堆栈段设置为 2000h并把栈顶指针设置为 010h,利用堆栈操作在压栈的时候 ...

最想不明白的是,为什数据段DS 1000H  中的数据会被直接压入堆栈20010H中,这两个不同的段地址之间是如何关联的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 17:57 | 显示全部楼层
本帖最后由 jackz007 于 2025-4-21 18:01 编辑
爬虫121 发表于 2025-4-21 17:43
最想不明白的是,为什数据段DS 1000H  中的数据会被直接压入堆栈20010H中,这两个不同的段地址之间是如何 ...


         没有什么好神秘的,其实,就是把内存的 2000:0000 - 2000:0010 一共 16 个字节的内存作为堆栈使用,这样,当向堆栈中保存(push)数据的时候,其实也就是在向内存 2000:0000 - 2000:0010 转存数据。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 22:20 From FishC Mobile | 显示全部楼层
是的,想问的是,为什么执行push指令,就会将DS数据段地址上的数据存入栈内
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 23:51 From FishC Mobile | 显示全部楼层
爬虫121 发表于 2025-4-21 22:20
是的,想问的是,为什么执行push指令,就会将DS数据段地址上的数据存入栈内

汇编指令所访问的内存在没有特别指明段前缀的情况下,缺省的段地址都在 DS 寄存器中。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 03:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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