新人求解一点汇编疑问关于寄存器的
刚刚这两天在学小甲鱼哥哥的汇编第三章时遇到了点问题,麻烦各位大神给个指点:首先关于数据段:
我自己尝试后发现设置好了段码后,不过是数据区的短码“DS”,还是指令区的段码“CS”,不管数据区如何改变,就算溢出进位,段码区也不会改变,那岂不是在编程时最多只能写64Kb的数据或指令就得再次改变段码?
还有就算关于“栈”,假如我打算设”1000H-100fH“为栈段,我设置“sp“为“0010”,然后一步步push,当减到”0“时直接下一个”fffe“,而不是”0010“,难道栈不能循环重置吗。
关于栈的,0-2肯定给SP置成fffe.因为这个是按寻址范围来算的,cpu没有那么智能。
64k已经很大了,如果写的程序很长,肯定要分成多个子程序来写的。要不看都看不懂了。 段代码可以通过跳转来改变。 学习学习,汇编语言有点难哦 栈还不是太懂 后面一直在讲栈,这个必须懂。定义栈时要多定义点,不能用到多少就定义多长,这样肯定会溢出。因为在单步操作中,要用到五个字的长度的栈段。如果栈段和数据段在一个段内,那么数据段中的数据会被冲。如果不在一个段内,程序会异常结束。栈段的寻址范围为SS:0000-SS:0ffff.溢出的数据会循环存放。 assume cs:codesg,ds:datasg,ss:stack
datasg segment
dw 123h,234h,345h,456h,567h,678h,789h,890h
datasg ends
stack segment
dw 8 dup(0)
stack ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
push ax
push ax
push ax
push ax
push ax
push ax
push ax
mov ax,4c00h
int 21h
codesg ends
end start
在单步执行到第六次push后,查看data段,数据没有被改变。
根据王爽老师的汇编语言第二版教材,第十二,十三章,
我知道了单步操作是中断,要进行压栈操作。pushf.
push cs,push ip
这是进行了三次压栈操作。可是在程序中,在进行第七次压栈时
直接无效操作。给踢出程序了。
如果把dw 8 dup(0)给改为6,那么第五次压栈操作时就给踢出去了。
但是,数据段的内容并没有改变。
进行第七次压栈时。
这是进行第三次压操作后,栈段的数据,那么第四次压栈就应该会溢出了。
那么我的问题就是,单步操作要进行三次压栈,另外的两个字的内容是被什么操作
改变的。溢出的数据存在了那儿。是存在了13c7:fffe 开始的地方了吗。
如果程序修改下。
assume cs:codesg,ds:datasg
datasg segment
dw 123h,234h,345h,456h,567h,678h,789h,890h
dw 8 dup(0)
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov ss,ax
mov sp,32
push ax
push ax
push ax
push ax
push ax
push ax
push ax
mov ax,4c00h
int 21h
codesg ends
end start
在第四次压栈操作时,数据就被改变。但是程序能完成。 为什么会是五个字的内容,不是三个的,我没找到原因。图就不发了。 可以用d xxxx:xxxx xxxx 自己去看的
页:
[1]