王爽汇编语言6.3疑惑点
书本给出的程序内容为:assume cs:code
code segment
DW 0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H
DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //按照我的理解,应该是DW 0,0,0,0,0,0,0,0八个字就可以了,何必需要16个字.
start:mov ax,cs
mov ss,ax
mov sp,30H //按照我的理解,应该是八个字20H就可以了,何必需要16个字.
mov bx,0
mov cx,8
s:push cs:
add bx,2
loop s
mov bx,0
mov cx,8
so:pop cs:
add bx,2
loop s0
mov ax,4c00H
int 21H
code ends
end start
但是从我看的书本知识来看,这道题只是要将开始给出的8组字逆序排放,那么栈地址书本上为什么要给出的是30H?我觉得给8个字20H就可以了.另外我测试了下,发现20H也可以正常逆序排放,请问书本上的30H是作为什么目的? 不懂汇编,但是你说的8字,一个宽字符为2个字节,8个字等于16字符,没毛病呀!! 把DW 0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H看成
DW 01H,023H,04H, 56H,07H,89H,0AH,BCH,0DH,EFH,0FH,EDH,0CH,BAH,09H,87H就可以理解了 我个人的理解是,sp是水桶底部的水瓢(底部指针),你往栈里加水(数据),水瓢(指针)就往上浮。
虽然伪指令好像不一定就直接申请空间了,但他一开始的指令就相当于申请了16个字大小的空间,这时,如果把sp设为16个字,那就是在桶低的位置,如果设为8个字,那就是用铁板封死了8个字的位置,直接从一半开始用起了。
另外,实际执行循环的控制变量是CX,所以只要栈的空间够,你SP要弄个特别大的空间也是没半毛钱问题的。
z1390595 发表于 2020-1-12 16:34
我个人的理解是,sp是水桶底部的水瓢(底部指针),你往栈里加水(数据),水瓢(指针)就往上浮。
虽然伪 ...
另外,不太懂,为什么20H是8个字,30H是16个字?
30H = 48
20H = 32
10H = 16
8个字应该是16字节吧。
所以我估计这里改成10H应该也可以吧?,楼主要不要考虑试下?(我这边没有汇编环境,所以没有自己尝试了) 本帖最后由 qwert0312 于 2020-1-13 00:04 编辑
z1390595 发表于 2020-1-12 16:44
另外,不太懂,为什么20H是8个字,30H是16个字?
30H = 48
20H = 32
你好,因为定义数据用掉了16个字节,然后再定义栈空间又用掉了16个字节,如果栈为空,SP等于栈底加1,所以如果我定义的是16个字节,那么SP自然等于20H.如果定义SP是10F,那么push将会更改掉定义的原始数据. qwert0312 发表于 2020-1-13 00:02
你好,因为定义数据用掉了16个字节,然后再定义栈空间又用掉了16个字节,如果栈为空,SP等于栈底加1,所以如果 ...
对哦,太久没用汇编了,有点忘记了。
以前写汇编的时候都习惯另外定义SS段的,忽略了你 mov ss,ax;那句了{:1_907:}
页:
[1]