关于汇编的一道题
assume cs:codecode segment
dw 0123h,0456h,0789h,0abch,0bceh,0888h,0999h,0eeeh
dw 0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov bx,0
mov sp,32
mov cx,8
s: push cs:
add bx,2
loop s
mov bx,0
mov cx,8
s0: pop cs:
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends
end start
如题,这个程序是把数倒过来存放,答案是正确的,但结果让我很不解,就是,为什么最后的16~32个字节单元中的数据会改变,明明没有修改操作啊
暗pluto 发表于 2019-2-21 18:33
对,这个过程我知道,但是问题是程序运行结束后,16~31那16个字节中的数为什么不是我按顺序放下去的数, ...
你是否使用了单步中断?
debug载入并运行程式时,下达t,p或g等指令时,会短暂的借主程式的栈以作暂存之用。比如 [保存] 主程式的cs,ip或flag等值。
这就是原因。 本帖最后由 jackz007 于 2019-2-21 18:40 编辑
mov sp , 32 把栈顶指针指向了 cs : 32, 这样,从 cs : 0 ~ 31 共 16 个 word 的内存区域被平分为两个部分,其中,前一半 cs : 0 ~ 15 为数据区,后一半 cs : 16 ~ 31 为堆栈区。程序中的 push cs: 每执行一次,cs: 的 2个字节就会被存入 cs : sp 所指向的 2 个字节的内存(堆栈),sp 就会相应减 2,执行完 loop s 指令,cs : 0 ~ 15 的总共 8 个 word 的内容就会全部存入堆栈,也就是内存 cs : 16 ~ 31 的区域。
程序接下来又把堆栈中的全部 8 个 word 的内容顺序取出,依次存入 cs:0 ~ 15 的内存区域,看上去虽然和前面存入堆栈的顺序完全一样,但是,由于堆栈先进后出的特性,所以,最先被取出的是最后入栈的那个 word,最后被取出的是最先入栈的 word,这样,原来 cs:0 ~ 15 区域的 8 个 word 就实现了首位对调的效果。 jackz007 发表于 2019-2-21 18:16
mov sp , 32 把栈顶指针指向了 cs : 32,push cs: 每执行一次,cs: 的 2个字节就会被存入 cs : sp...
对,这个过程我知道,但是问题是程序运行结束后,16~31那16个字节中的数为什么不是我按顺序放下去的数,而是一堆奇奇怪怪的数据 行客 发表于 2019-2-21 19:08
你是否使用了单步中断?
debug载入并运行程式时,下达t,p或g等指令时,会短暂的借主程式的栈以作暂存 ...
中断还没学到,是因为使用了t,p或g指令导致的吗,那有没有办法使其不改变而又能查看内存数据的方法或指令呢? 暗pluto 发表于 2019-2-21 19:14
中断还没学到,是因为使用了t,p或g指令导致的吗,那有没有办法使其不改变而又能查看内存数据的方法或指 ...
是的,是因为这个原因。目前我暂时还没有找到什么办法,因为调试状态下,没办法不使用中断命令。 别纠结了,知道原理就可以了。不用调试没办法查看实时变化;一下执行结束整个缓冲区都可能会发生变化。
不过也可以有办法,就是再写一个程序实时监测内存变化做记录。不过这是不是把事情搞复杂了啊 行客 发表于 2019-2-21 19:27
别纠结了,知道原理就可以了。不用调试没办法查看实时变化;一下执行结束整个缓冲区都可能会发生变化。
...
谢谢了,就是想搞明白为什么变了,不过现在知道原因了就没那么纠结了
没看懂 新手zz 发表于 2019-2-21 21:28
没看懂
你得先看得懂汇编,不然你不知道我在说什么的
页:
[1]