|
主题 : : 请教assume的作用。 [已解决] |
回复[ 5次 ]
点击[ 605次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-09-23 14:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23 |
assume 最典型的用法:是指明变量与段寄存器的联系,比如 assume ds:data,它是告诉编译器以后所有在data段中定义的变量寻址时,使用ds作为段地址,但是它不对程序作任何事,比如你必须自己对ds赋值。
现在有如下程序
assume ds:data1
data1 segment
mov ax,[bx]
data1 ends
data2 segment
mov ax,[bx]
data2 ends
根据最上面那段话是否可以这样理解:
data1中mov ax,[bx]等于mov ax,ds:[bx]
而data2中的mov ax,[bx]是不一定等于mov ax,ds:[bx]. | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-09-23 14:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-09-19 08:05 |
首先 你的mov ax,【bx】 全部会翻译成机器码,当成数据来处理,因为程序执行的指令永远根据CS iP指向的内容来执行的,你那个语句如果想执行,就要将cs的值等于ds了!不然计算机知识把它当成值!我也刚学汇编几天,不是很了解!但你所表达的意思肯定和计算机不一样! | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-09-23 15:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23 |
首先 你的mov ax,【bx】 全部会翻译成机器码,当成数据来处理,因为程序执行的指令永远根据CS iP指向的内容来执行的,你那个语句如果想执行,就要将cs的值等于ds了!不然计算机知识把它当成值!我也刚学汇编几天,不是很了解!但你所表达的意思肯定和计算机不一样!
------------------
回复:这里跟CS没有关系,
重点: assume ds:data,它是告诉编译器以后所有在data段中定义的变量寻址时,使用ds作为段地址, | | |
|
|
|
|
[第3楼]
[ 回复时间:2011-09-24 01:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
data1中mov ax,[bx]等于mov ax,ds:[bx]
而data2中的mov ax,[bx]是不一定等于mov ax,ds:[bx].
不是的,首先,你如果想让cpu把data1中的内容当成指令,就要使cs=ds,不然段1中的只有数据,不是指令,就不存在寻址了。虽然指令也是数据,但是当cs:ip指向它时才算指令。如果cs=data1那第一个就是ds:[bx],如果cs=data2那第二个也是ds:[bx]
这是因为Bx默认的段寄存器是ds,而是指令还是数据是Cs:ip说了算。
书上说在内存中指令与数据是怎么存储的这句话还没有理解透。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2011-09-25 11:09 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23 |
根据实际实验来看,assume好像没什么作用,其后内容去掉了用r查看ds等也没有变化 | | |
|
|
|
|
[第5楼]
[ 回复时间:2011-09-27 16:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23 |
此贴由 贴主 于 [ 2011-09-27 16:07 ] 结贴。 结贴原因:问题已解决 | | |