[求助]汇编里的寄存器sp的值不能小于4吗?

realvk 2018-2-13 11:24 524
环境:
xp x86
masm编译器编译汇编程序,用debug调试。
背景:
做一道题目,把ffff0~ffffb内存地址的数据复制到00200~0020b
assume cs:codesg
codesg segment
start:    mov ax,0ffffh
        mov ds,ax
        mov ax,20h
        mov ss,ax
        mov sp,0ch
        
        mov bx,0ah
        mov cx,6
    s:  mov ax,[bx]
        push ax
        sub bx,2
        loop s
        mov ax,4c00H
        int 21H
codesg ends
end start
我的思路是:
既然要复制到20:0~20:b,
那我就把这段地址设置为栈段
ffff:0~ffff:b设置为数据段
然后压栈就好了

可是当sp的值为4时,在压栈就退出debug了
下面是设置完ss sp后的样子:

63 05指向马上要被压栈的字单元,它前面还有个65 0b
等这个两个字单元到了最左边,也就是sp变成4后,下一步就出错,退出debug了

为了验证我的想法,我换了下ss:sp,但是指向的内存位置还是不变
assume cs:codesg
codesg segment

start:	mov ax,0ffffh
		mov ds,ax
		mov ax,1fh
		mov ss,ax
		mov sp,1ch
		
		mov bx,0ah
		mov cx,6
	s:	mov ax,[bx]
		push ax
		sub bx,2
		loop s

		mov ax,4c00H
		int 21H
codesg ends
end start
1f:1c = 20:0c
结果可以执行成功:


那么我心里存在以下几个问题:
1.sp的值不能小于4?按道理应该是还没到栈边界呀

2.  63 05所在的位置就是下一次压栈的位置,可是我学习的时候,教程说的是,压栈时,sp先减2,然后在把值放进来,这个63 05和sp什么关系
  前面的65 0B又是什么,莫非是因为我32位系统,移动的单位应该是双字?

小弟初来乍到,请表哥们多多关照
最新回复 (1)
啰嘻哈呲吧 2018-2-18 09:58
2
63  05就是内存字单元020:a-020:b的数据,跟sp应该没关吧
返回