|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 zhzwsaber 于 2022-9-14 11:07 编辑
汇编第6章实验5的第一题进行sp改动后code全部出错了,书本上面是mov sp,16,我改成mov sp,20H。
进入程序直接 -u cs:0查看整个程序的代码都是正常的
然后开始执行,前面两步都是正常的。
mov ax,stack
mov ss,ax
第三步原本应该是
mov sp,0020
却会变成
add [BX+SI],AL
我搞不明白
贴上完整代码
- assume cs:code,ds:data,ss:stack
- data segment
- dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
- data ends
- stack segment
- dw 0h,0h,0h,0h,0h,0h,0h,0h
- stack ends
- code segment
- start: mov ax,stack
- mov ss,ax
- mov sp,20h
- mov ax,data
- mov ds,ax
- push ds:[0]
- push ds:[2]
- pop ds:[2]
- pop ds:[0]
- mov ax,4c00h
- int 21h
- code ends
- end start
复制代码
debug 启动
-R
AX=FFFF BX=0000 CX=0042 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=075A ES=075A SS=0769 CS=076C IP=0000
076C:0000 B86B07 MOV AX,076B
-D cs:0
076C:0000 B8 6B 07 8E D0 BC 20 00-B8 6A 07 8E D8 FF 36 00
注意重点来了,执行两步以后20 00这个数据会被改变成6B 07
-T
省略寄存器信息
076C:0003 8ED0 MOV SS,AX
-T
省寄存器信息
076C:0008 0000 ADD [BX+SI],AL
-D CS:0
076C:0000 B8 6B 07 8E D0 BC 6B 07-00 00 08 00 6C 07 A3 A1
我就发现代码段后面很多值都被改变了,我很想贴图上来,但是没权限。
本帖最后由 jackz007 于 2022-9-14 11:38 编辑
是的,因为堆栈空间的使用我们是无法把控到的,堆栈中,所有位于 SP 以下的数据都是危险的,随时都有可能被覆盖到。堆栈被使用过后,都会及时退栈,表面上看,SP 没有改变,但是,SP 以下的很多内容都已经发生了改变,改变区域就是堆栈曾经被使用的深度。
|
|