小乌龟 发表于 2011-5-15 23:23:11

监测点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:}

sunhopp 发表于 2011-5-16 00:12:14

以下是我的理解!希望我没有理解错!
问题一、是鱼哥弄错了,应该是10个字!
问题二、如果栈定义为10个字,那SP就是你所说的24H (16+20=36=24H)

lxbwyr 发表于 2011-5-16 00:29:52

本帖最后由 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

小乌龟 发表于 2011-5-16 13:52:08

感谢两位,我明白了!
   第一,应该是甲鱼老师弄错了,应该是10个字;
   第二,如果按照甲鱼老师的定义(定义5个字),甲鱼老师填的la就是对的。

超越自我 发表于 2011-5-16 14:14:46

本帖最后由 超越自我 于 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]
查看完整版本: 监测点6.1第二个问题的不解