|
主题 : : 直接定址表中的疑问 [待解决] |
回复[ 12次 ]
点击[ 981次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-10-16 22:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:24
信誉值:0
注册日期:2009-07-21 14:42 |
比如说
/////////////////////////////////
data segment
table dw sub1,sub2,sub3,sub5
data ends
/////////////////////////////////
与
/////////////////////////////////
data segment
table dw offset sub1,offset sub2,offset sub3,offset sub4
data segment
/////////////////////////////////
这两段代码 有什么不同
我在代码中 用这两种形式编写,都能通过编译,运行也都没有问题
请问,到底应该加offset还是不应该加offset | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-10-16 22:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:24
信誉值:0
注册日期:2009-07-21 14:42 |
目前我自己的理解是,应当是加上offset的,但是由于为了方便需要,微软的编译器允许省略这个命令。
不知道我理解的有没有错误 | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-10-16 22:34 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-02 15:26 |
我能准确的告诉你!楼上说的是错的!而且楼主没有把书看明白哦!书上有段话是这样的:我们可以把标号当作数据来定义,此时,编译器装将标号所表示的地址当作数据的值:比如:
data segment
a db 1,2,3,4,5,6,7,8
d dw 0
c dw a,b
data ends
数据标号C处存储的两个字型数据(a,b)为标号A,B的偏移地址相当于:
data segment
a db 1,2,3,4,5,6,7,8
d dw 0
c dw offset a,offset b
data ends
如果把数据标号C处改成:c dd a,b,想当于:c dw offset a,seg a,offset b,seg b
dd是双字型数据
seg操作符,功能为取得某一标号的段地址. | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-10-16 22:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-04-02 15:26 |
如果真要回答个,这两道问题有什么区别的话,哪就是一个画蛇添足,一个没有。楼主认真看看书吧,书上讲的很清楚啦! | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-10-17 00:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:24
信誉值:0
注册日期:2009-07-21 14:42 |
哦 也就是说 那段代码中的
c dw a,b
相当于
c dw offset a,offset b
也就是说
相当于 就是 等于
就是说
没有区别 | | |
|
|
|
|
[第5楼]
[ 回复时间:2009-10-17 00:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26 |
目前我自己的理解是,应当是加上offset的,但是由于为了方便需要,微软的编译器允许省略这个命令。
不知道我理解的有没有错误
------------------
回复:
table后面没有“:”,是数据标号,同时描写内存单元地址和单元长度的标号,既表示内存单元的地址,还表示内存单元的长度
所以我的回答是不用加OFFSET | | |
|
|
|
|
[第6楼]
[ 回复时间:2009-10-17 21:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:24
信誉值:0
注册日期:2009-07-21 14:42 |
哦,谢谢你们的回帖。虽然还是稀里糊涂的,不过 大概清楚些了。
谢谢你们。 | | |
|
|
|
|
[第7楼]
[ 回复时间:2010-05-21 09:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-05-18 08:21 |
回复:[第5楼]
------------------
既然表示内存地址,为啥是dw呢,内存地址好像不是16位吧? | | |
|
|
|
|
[第8楼]
[ 回复时间:2010-08-22 20:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
/////////////////////////////////
data segment
table dw sub1,sub2,sub3,sub5
sub1 db ....
.
.
data ends
/////////////////////////////////
与
/////////////////////////////////
data segment
table: dw offset sub1,offset sub2,offset sub3,offset sub4
sub1: db ..
.
.
data segment
/////////////////////////////////
你说这两段有区别么?
数据标号可以作为数据来定义,此时标号表示的就是偏移地址。你在前面加个offset不是多此一举。p291的例子说得很清楚了。 | | |
|
|
|
|
[第9楼]
[ 回复时间:2010-08-22 23:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-07-13 23:22 |
默认情况下,不加offset就是默认它的偏移地址。加不加无所谓。但是,如果需要段地址的话,比如c dd a b就是取段地址和偏移地址。不能加offset了。P291 | | |
|
|
|
|
[第10楼]
[ 回复时间:2010-08-23 15:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
在定义一个data segment的时候,可以省略offset,但是在程序操作语句中是不能省略的。就好比,
table dw a,b,c
mov bx,offset table;将字单元的内容传送给bx
mov bx,table;将一个地址传送给bx
在实验16中就会看到这样的用法了。 | | |
|
|
|
|
[第11楼]
[ 回复时间:2011-04-05 16:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-02-16 22:23 |
准确的说是标号表示地址,offset是取偏移地址。所以两个都对。 | | |
|
|
|
|
[第12楼]
[ 回复时间:2011-09-25 11:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23 |
在定义一个data segment的时候,可以省略offset,但是在程序操作语句中是不能省略的。就好比,
table dw a,b,c
mov bx,offset table;将字单元的内容传送给bx
mov bx,table;将一个地址传送给bx
在实验16中就会看到这样的用法了。
------------------
回复:
见176页,“mov ax,offset s相当于mov ax,3,因为s是代码段中的标号,它所标记的指令是代码段中的第二条指令.....,则s的偏移地址为3”
这里应该是将一个地址传送给ax | | |