爬虫121 发表于 3 天前

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

内容去下图

谢谢

FishC 发表于 3 天前

检测点3.2解答

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


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

push       ; 将内存1000:0000的字数据压栈
push       ; 将内存1000:0002的字数据压栈
pop      ; 弹出数据到1000:0002(完成数据交换)
pop      ; 弹出数据到1000:0000(完成数据交换)



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


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

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

爬虫121 发表于 3 天前

最好讲解一下,
不明白这两块不同地址应该如何关联到一起处理

jackz007 发表于 前天 00:47

本帖最后由 jackz007 于 2025-4-21 13:29 编辑

      把数据段设置为 1000h,把堆栈段设置为 2000h并把栈顶指针设置为 010h,利用堆栈操作在压栈的时候,栈顶指针会由栈顶向栈底移动的特性,当把 ds: 入栈时,会转存2个字节(1个word)到栈顶 ss:,当将 ds: 入栈时,会转存2个字节(1个word)到栈顶 ss:,...... 依此类推,当把 ds: 入栈时,会转存2个字节(1个word)到栈顶 ss:,从而达到了将 10000H-10010H 处的 8 个 word 依逆序保存到 20000H-20010H 的目的。
assume cs : code
code segment
start: mov ax,1000h
       mov ds,ax
       mov ax,2000h            ; 填空第 1 行内容
       mov ss,ax               ; 填空第 2 行内容
       mov sp,10h            ; 填空第 3 行内容
       push word ptr        ; ds:--> ss:
       push word ptr        ; ds:--> ss:
       push word ptr        ; ds:--> ss:
       push word ptr        ; ds:--> ss:
       push word ptr        ; ds:--> ss:
       push word ptr    ; ds:--> ss:
       push word ptr    ; ds:--> ss:
       push word ptr    ; ds:--> ss:
       mov ax,4c00h
       int 21h
code ends
end start

爬虫121 发表于 前天 17:43

jackz007 发表于 2025-4-21 00:47
把数据段设置为 1000h,把堆栈段设置为 2000h并把栈顶指针设置为 010h,利用堆栈操作在压栈的时候 ...

最想不明白的是,为什数据段DS 1000H中的数据会被直接压入堆栈20010H中,这两个不同的段地址之间是如何关联的

jackz007 发表于 前天 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 转存数据。

爬虫121 发表于 前天 22:20

是的,想问的是,为什么执行push指令,就会将DS数据段地址上的数据存入栈内

jackz007 发表于 前天 23:51

爬虫121 发表于 2025-4-21 22:20
是的,想问的是,为什么执行push指令,就会将DS数据段地址上的数据存入栈内

汇编指令所访问的内存在没有特别指明段前缀的情况下,缺省的段地址都在 DS 寄存器中。

爬虫121 发表于 半小时前

jackz007 发表于 2025-4-21 23:51
汇编指令所访问的内存在没有特别指明段前缀的情况下,缺省的段地址都在 DS 寄存器中。

谢谢
页: [1]
查看完整版本: 看小甲鱼的汇编,讲解王爽老师的书,请问如何编程检测点3.2