qwert0312 发表于 2020-1-6 23:29

王爽汇编语言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是作为什么目的?

xiaohui888 发表于 2020-1-7 09:50

不懂汇编,但是你说的8字,一个宽字符为2个字节,8个字等于16字符,没毛病呀!!

cube 发表于 2020-1-8 17:27

把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就可以理解了

z1390595 发表于 2020-1-12 16:34

我个人的理解是,sp是水桶底部的水瓢(底部指针),你往栈里加水(数据),水瓢(指针)就往上浮。
虽然伪指令好像不一定就直接申请空间了,但他一开始的指令就相当于申请了16个字大小的空间,这时,如果把sp设为16个字,那就是在桶低的位置,如果设为8个字,那就是用铁板封死了8个字的位置,直接从一半开始用起了。

另外,实际执行循环的控制变量是CX,所以只要栈的空间够,你SP要弄个特别大的空间也是没半毛钱问题的。

z1390595 发表于 2020-1-12 16:44

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:02

本帖最后由 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将会更改掉定义的原始数据.

z1390595 发表于 2020-1-13 09:34

qwert0312 发表于 2020-1-13 00:02
你好,因为定义数据用掉了16个字节,然后再定义栈空间又用掉了16个字节,如果栈为空,SP等于栈底加1,所以如果 ...

对哦,太久没用汇编了,有点忘记了。
以前写汇编的时候都习惯另外定义SS段的,忽略了你 mov ss,ax;那句了{:1_907:}
页: [1]
查看完整版本: 王爽汇编语言6.3疑惑点