看小甲鱼的汇编,讲解王爽老师的书,请问如何编程检测点3.2
内容去下图谢谢 检测点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 小助理,如未能正确解答您的问题,请继续追问。 最好讲解一下,
不明白这两块不同地址应该如何关联到一起处理
本帖最后由 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 jackz007 发表于 2025-4-21 00:47
把数据段设置为 1000h,把堆栈段设置为 2000h并把栈顶指针设置为 010h,利用堆栈操作在压栈的时候 ...
最想不明白的是,为什数据段DS 1000H中的数据会被直接压入堆栈20010H中,这两个不同的段地址之间是如何关联的 本帖最后由 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 转存数据。 是的,想问的是,为什么执行push指令,就会将DS数据段地址上的数据存入栈内 爬虫121 发表于 2025-4-21 22:20
是的,想问的是,为什么执行push指令,就会将DS数据段地址上的数据存入栈内
汇编指令所访问的内存在没有特别指明段前缀的情况下,缺省的段地址都在 DS 寄存器中。 jackz007 发表于 2025-4-21 23:51
汇编指令所访问的内存在没有特别指明段前缀的情况下,缺省的段地址都在 DS 寄存器中。
谢谢
页:
[1]