酸辣小白菜 发表于 2017-7-30 13:51:07

实验5,(3)

assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h
data ends
stack segment
dw 0,0
stack ends
code segment
start : mov ax,stack
      mov ss ,ax
      mov sp,16
      mov ax,data
      mov ds,ax
      push ds,
      push ds,
      pop ds,
      pop ds,
mov ax,4c00h
int 21h
code ends
end start        
为啥mov sp,16
栈段定义8个字型数据和定义2个字型数据都是mov sp,16?

酸辣小白菜 发表于 2017-7-30 14:41:01

有木有解答的,有点迷啊

酸辣小白菜 发表于 2017-7-30 14:51:01

就是栈的偏移地址根据什么而定?   一定是16么?    上面程序中只有两个字,栈的偏移地址能否从4开始?好无语啊

我是大神哥哥 发表于 2017-7-30 16:26:29

本帖最后由 我是大神哥哥 于 2017-7-31 10:57 编辑

请看楼下!

erh 发表于 2017-7-31 10:55:14

assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h
data ends
stack segment
dw 0,0
stack ends
code segment
start : mov ax,stack
      mov ss ,ax
      mov sp,16
      mov ax,data
      mov ds,ax
      push ds,
      push ds,
      pop ds,
      pop ds,
mov ax,4c00h
int 21h
code ends
end start         


为啥mov sp,16
栈段定义8个字型数据和定义2个字型数据都是mov sp,16?
---------------------------------------------------------------------------------
对于这个程序不会出错。因为段对齐的原因,编译器会留16的整数倍的地址,但是只会将前四个字节初始化为0.
最好还是这样,
stack segment
    dw 0,0,0,0,0,0,0,0
stack ends
要用多少栈就初始化多少,否则容易出错。
比如上面的程序,如果mov sp,32,就会出错。把代码段给覆盖了。

酸辣小白菜 发表于 2017-8-2 10:14:19

谢谢你,回复的很清楚,还要多学习啊 嘿嘿
页: [1]
查看完整版本: 实验5,(3)