监测点6.1第二个问题的不解
本帖最后由 小乌龟 于 2011-5-16 13:52 编辑assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0
start:
mov ax,cs ;cs为所填第一空
mov ss,ax
mov sp,1ah ;此条指令为所填第二空
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s:
push
pop cs: ;此条指令为所填第三空
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
书上定义了10个字单元作栈空间,为什么甲鱼老师给的答案上只有5个?
还有关于第二个空mov sp,___,这里我想不通为什么填1a?
我的理解是:
前边已经定义了8个字型数据,就是16个内存单元,栈空间是
从数据段后开始到往后10个字单元(20个内存单元),
那也是从15开始的,到35(16+20),sp应该指向36,即24H。
求解释……{:3_59:} 以下是我的理解!希望我没有理解错!
问题一、是鱼哥弄错了,应该是10个字!
问题二、如果栈定义为10个字,那SP就是你所说的24H (16+20=36=24H)
本帖最后由 lxbwyr 于 2011-5-16 00:33 编辑
assume cs:codesg
codesg segment
dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h这里定义了从0-F单元的内容
CS : 01 23 45 67 89 AB CD EF 对应上面内容的偏移地址
dw 0 , 0 , 0 , 0 , 0 这里定义了5个栈空间
偏移 10-11 12-13 1415 16-17 18-19对应上面内容的偏移地址
再后面就是栈1a
start:
mov ax,cs ;
mov ss,ax 将原来的代码段段地址通过ax 转给栈段
mov sp,1ah ;这时栈是空的。因此栈顶指向1A
mov ax,0
mov ds,ax 数据段DS,也就是最初来CS的段
mov bx,0
mov cx,8
感谢两位,我明白了!
第一,应该是甲鱼老师弄错了,应该是10个字;
第二,如果按照甲鱼老师的定义(定义5个字),甲鱼老师填的la就是对的。
本帖最后由 超越自我 于 2011-5-16 14:20 编辑
我的理解是:首先数据段和栈段都是在cs段中,在这个段中总共是定义了13个字单元(这应该没错吧?),而sp是栈顶指针,sp指向的是13个字单元的后一个字节单元,也就是编号为26的那个字节单元(因为内存单元是从0开始编号的),转换成16进制即为1A
另外书本上的:
start:
mov ax,cs ;
mov ss,ax 将原来的代码段段地址通过ax 转给栈段
mov sp,1ah ;这时栈是空的。因此栈顶指向1A
mov ax,0;应该改成:mov ax,cs
mov ds,ax 数据段DS,也就是最初来CS的段
mov bx,0
mov cx,8
页:
[1]