关于栈、程序起始地址的两个困扰我的问题
1. stack segmentdw0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
stack ends
用这种方法定义栈段,用debug调试,当用D命令查看栈中的内容时,为什么前20个字节不全是0?如下:
2.不是说程序是从SA+10H:0处开始的吗?也就是说cs应该等于SA+10H,而SA==DS,为什么下面的程序运行后是ss ==SA+10H ,CS==SA+12H?
assume cs:code ,ds:data ,ss:stack
data segment
dw0123h ,0456h ,0789h ,0abch ,0defh ,0fedh ,0cbah ,0987h
data ends
stack segment
dw0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
stack ends
code segment
start: mov ax ,stack
mov ss ,ax
mov sp ,14h
mov ax ,data
mov ds ,ax
mov bx ,0
mov cx ,8
s:push
add bx ,2
loop s
mov bx ,0
mov cx ,8
s0: pop
add bx ,2
loop s0
mov ax ,4c00H
int 21H
code ends
end start
朋友经过我的debug发现了点东西,首先(ds)=13ef ,所以程序的数据开始应该在ds+10h,即13ffh处开始,但13ffh开始放的并不是程序的入口,而是数据段和栈段的数据共需36个字节,即16进制的24h,注意(ss)=13ffh, (cs)=1402h表示的是段地址,实际地址还要乘16,即ss的实际地址是13ff0h,cs实际地址的14020h,总共相差30h个地址,那为什么要相差30h个地址呢?明明数据段和栈只用了24h个地址,其实那多出来的6h地址是为了方便能设置(ip)=0,如果在(cs)=(ds)+25h,那么ip的值就肯定不为0了,这是我的一点猜测 1. 第一個問題我也碰到過, 不過實際在使用的時候他不會給你出錯的
2.第二個問題, 你dw 20個字節, 您也知道, 每個段的偏移量是16, 所以20個字節要往前偏移2個段的最小單位, 也就是32個字節, 但是棧頂卻是在 CS:20, CS:21~CS:31這段都浪費了 1. 栈,会记录一些寄存器的值。 看书!!!
不懂
页:
[1]