zh_nan2012 发表于 2011-12-16 21:15:16

实验五的变种求解答

本帖最后由 zh_nan2012 于 2011-12-19 21:42 编辑

在程序开始有“assume ss:stack”。然后程序中有mov ax,stack。我用debug调试的时候,在开始加载上程序后(debug *.exe),的到的ss的数值怎么和程序运行到mov ax,stack是stack的数值不一样???
ss=1434,stack转换成地址却是1435????????????搞不懂,不是一开始assume关联这两个的数值不应该一样么???

api 发表于 2011-12-17 00:12:01

就算在开头定义了ss:stack,在程序中也要做mov ax,stackmov ss,ax这一步

zh_nan2012 发表于 2011-12-18 18:28:01

api 发表于 2011-12-17 00:12 static/image/common/back.gif
就算在开头定义了ss:stack,在程序中也要做mov ax,stackmov ss,ax这一步

我明白,assume ss:stack 是为了程序可读设定的。但我现在不明白的是:用-r 指令查看ss的数值和在程序中cpu将标号stack转化得地址并非相等?为什么?
程序一开始用assume ss:stack

我原来的理解应该是“比如我一开始用-r查看ss=1434”那么我用-t 命令执行mov ax,stack这条指令时应该翻译成“mov ax,1434 ”,但为什么实际是“mov ax,1435“。搞不明白。高手指点下。

api 发表于 2011-12-18 23:31:14

我懂你的意思了,我表达不是很好,写两个代码你就清楚了。你的程序是从assume开始的,而不是从代码段开始的。assume cs:codesg,ss:stacksg

stacksg segment      
dw 0,0,0,0,0,0,0,0
stacksg ends

codesg segment
start:mov ax,stacksg
             mov ss,ax
               
             mov ax,4c00h
         int 21h
codesg ends
end start

assume cs:codesg,ss:stacksg,ds:data

data segment      
db 'Hello world!',0
data ends

stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends

codesg segment
start:mov ax,stacksg
             mov ss,ax
               
             mov ax,4c00h
         int 21h
codesg ends
end start

zh_nan2012 发表于 2011-12-19 21:32:27

api 发表于 2011-12-18 23:31 static/image/common/back.gif
我懂你的意思了,我表达不是很好,写两个代码你就清楚了。你的程序是从assume开始的,而不是从代码段开始的 ...

奥,原来如此,小弟受教了。thanks

心動の軌跡 发表于 2011-12-21 04:02:34

学的好仔细啊 我都没注意到这个情况

编程新手 发表于 2011-12-23 15:32:56

心動の軌跡 发表于 2011-12-21 04:02 static/image/common/back.gif
学的好仔细啊 我都没注意到这个情况

我理解能力不是很好,没看明白你那2个程序,上面和下面有啥区别,为什么说一个是从assume开始的,一个是从代码段开始的?
页: [1]
查看完整版本: 实验五的变种求解答