在学习汇编的时候发现一个简单的代码出现了一个奇怪的问题
询问过后发现了DEBUG工具的一个小注意事项(或者说是没用的知识点)
ASSUME SS:STACKS,CS:CODES,DS:a,ES:b
a SEGMENT
ONE dw 01h,02h,03h,04h,05h,06h,07h,08h
a ENDS
b SEGMENT
TWO dw 01h,02h,03h,04h,05h,06h,07h,08h
b ENDS
STACKS SEGMENT
DW 00H,00H,00H,00H,00H,00H,00H,00H
DW 00H,00H,00H,00H,00H,00H,00H,00H
STACKS ENDS
CODES SEGMENT
START:
MOV AX,A
MOV DS,AX
MOV AX,B
MOV ES,AX
MOV AX,STACKS
MOV SS,AX
MOV SP,32
MOV CX,8
MOV BX,0
addNumber:
MOV AX,0
ADD AX,DS:[BX]
ADD AX,ES:[BX]
PUSH AX
ADD BX,2
loop addNumber
MOV AH,4CH
INT 21H
CODES ENDS
END START
该代码的意图是把A段以及B段的内存移动到栈当中
不过这里不管代码本身的问题
这里有一个关键指令MOV SS,AX
注意这里的栈内存,在执行了MOV SS,AX指令后,自0770:0037到0770:003F的位置出现了一堆莫名其妙的内存
在之前分明是没有的,那么为什么MOV SS,AX会导致内存被污染呢
四处询问了下,因为DEBUG这个工具本质上也是一个中断指令,而在使用这个工具的时候,DEBUG有时会在栈空闲(还是没被利用的时候?)向栈中存放一些寄存器以及当前指令的内容
于是导致了栈污染,注意这里的SP依然是0020,所以他虽然使用了栈,但并没有导致栈顶移动,所以貌似是不影响栈的使用,就是不知道在DEBUG中如果向栈中存放数据 覆盖掉他的缓存会怎么样,暂时没有找到其他副影响
--------------------------------2018/2/26更新-------------------------------
学到后面的时候知道了 这里的具体原因,首先DEBUG是单步执行,属于内部中断
而中断过程有这么一个规则
1、取得中断类型码N
2、PUSHF
3、TF=0 IF=0
4、PUSH CS
5、PUSH IP
6、CS = N*4 + 2
7、执行中断程序
8、IRET(取出标志位寄存器、CS、IP)
所以上面程序debug中的内存污染 就是 PSW与CS和IP的值在执行的时候放进去的,同时这里由于程序已经执行完毕,所以SS:SP指向了原位置,所以并没有什么大的副影响