. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  直接定址表中的疑问  [待解决] 回复[ 12次 ]   点击[ 981次 ]  
ce54605802
[帖 主]   [ 发表时间: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
ce54605802
[第1楼]   [ 回复时间:2009-10-16 22:13 ]   [引用]   [回复]   [ top ] 
荣誉值:24
信誉值:0
注册日期:2009-07-21 14:42
目前我自己的理解是,应当是加上offset的,但是由于为了方便需要,微软的编译器允许省略这个命令。
不知道我理解的有没有错误
573085020
[第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操作符,功能为取得某一标号的段地址.
573085020
[第3楼]   [ 回复时间:2009-10-16 22:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-04-02 15:26
如果真要回答个,这两道问题有什么区别的话,哪就是一个画蛇添足,一个没有。楼主认真看看书吧,书上讲的很清楚啦!
ce54605802
[第4楼]   [ 回复时间:2009-10-17 00:25 ]   [引用]   [回复]   [ top ] 
荣誉值:24
信誉值:0
注册日期:2009-07-21 14:42
哦 也就是说  那段代码中的 
c dw a,b
相当于
c dw offset a,offset b
也就是说
相当于 就是 等于 
就是说
没有区别
tinyparticle
[第5楼]   [ 回复时间:2009-10-17 00:27 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
目前我自己的理解是,应当是加上offset的,但是由于为了方便需要,微软的编译器允许省略这个命令。
不知道我理解的有没有错误
------------------
回复:
table后面没有“:”,是数据标号,同时描写内存单元地址和单元长度的标号,既表示内存单元的地址,还表示内存单元的长度
所以我的回答是不用加OFFSET
ce54605802
[第6楼]   [ 回复时间:2009-10-17 21:19 ]   [引用]   [回复]   [ top ] 
荣誉值:24
信誉值:0
注册日期:2009-07-21 14:42
哦,谢谢你们的回帖。虽然还是稀里糊涂的,不过 大概清楚些了。
谢谢你们。
wuhengwen007
[第7楼]   [ 回复时间:2010-05-21 09:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-05-18 08:21
回复:[第5楼]
------------------
既然表示内存地址,为啥是dw呢,内存地址好像不是16位吧?
jjch224
[第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的例子说得很清楚了。
sleepinglion
[第9楼]   [ 回复时间:2010-08-22 23:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-07-13 23:22
默认情况下,不加offset就是默认它的偏移地址。加不加无所谓。但是,如果需要段地址的话,比如c dd a b就是取段地址和偏移地址。不能加offset了。P291
jjch224
[第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中就会看到这样的用法了。
michael1947
[第11楼]   [ 回复时间:2011-04-05 16:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-16 22:23
准确的说是标号表示地址,offset是取偏移地址。所以两个都对。
wang_ss
[第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
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved