-
-
[求助]汇编里的寄存器sp的值不能小于4吗?
-
发表于:
2018-2-13 11:24
3376
-
环境:
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位系统,移动的单位应该是双字?
小弟初来乍到,请表哥们多多关照
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课