【学习笔记】汇编:关于DEBUG工具使用的时候的一个注意事项

在学习汇编的时候发现一个简单的代码出现了一个奇怪的问题

询问过后发现了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指向了原位置,所以并没有什么大的副影响


猜你喜欢

转载自blog.csdn.net/h2809871142/article/details/79356973