milorguan 发表于 2011-7-10 22:08:36

弄了一晚上都没解决的问题

http://bbs.fishc.com/data/attachment/album/201107/10/220209akmhxhkcyidlhmq4.gif
assume cs:codesg,ss:stacksg,ds:datasg


datasg segment
db'1. display      '
db'2. brows      '
db'3. replace      '
db'4. medify       '
datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
start: mov ax,stacksg
       mov ss,ax
    mov sp,16
    mov ax,datasg
    mov ds,ax
mov ax,4c00h
int 21h
codesg ends
end start
如图,DS=144D,SS=145D,为什么数据段的内容存到堆栈段去了也就是存到145D去了

旭日东升 发表于 2011-7-10 22:48:45

因为现在的DS是指向PSP空间的段地址!
每个程序加载时,先回创建一段256个字节的PSP数据区。
所以程序的段地址应该是(段地址*16+10H), 这个地址正好是SS的段地址。
因为内存里面的代码可以当做数据、栈、或者代码来执行,所以这个是自己定的。
DS和SS同时指向了一个段地址!

请看王爽 汇编语言的第92页

milorguan 发表于 2011-7-11 09:34:32

但是我做了对DS的使用喔,不可能一直都指向PSP的头吧,我还是不太明白

旭日东升 发表于 2011-7-11 13:48:17

milorguan 发表于 2011-7-11 09:34 static/image/common/back.gif
但是我做了对DS的使用喔,不可能一直都指向PSP的头吧,我还是不太明白

你做了对DS的使用没错,但是你DEBUG的时候没等他运行到那一步你就查看了DS的值,不是吗?
你等运行完    mov ds,ax 然后再查看DS的值,肯定没错了!~

657301893 发表于 2011-7-11 20:46:16

不知道 我的编译运行后是好的耶 !机子问题

libocdf 发表于 2011-7-16 04:50:18

这个,我也不解,困惑,可能就是电脑问题吧

鱼C# 发表于 2011-7-16 11:23:36

画出内存的图,然后对照着分析,系统存在一段256个字节的数据区。
那么段地址应该是(ds*16+10H),ds和sscpu是不知道的,是程序员自己定义的

鱼C# 发表于 2011-7-16 11:24:20

为什么我抽奖都是惩罚啊??郁闷{:5_105:}
页: [1]
查看完整版本: 弄了一晚上都没解决的问题