请教关于偏移地址的问题

kanlejiuhao 2005-06-05 11:43:41
如下程序(可正常编译、运行):
.MODEL SMALL
.DATA
BUF DB '0123456789'
.CODE
MAIN:
MOV AX,@DATA
MOV DS,AX

LEA DX,BUF ;问题在这里

MOV AH,4CH
INT 21H
END MAIN

当运用debug查看结果时,其中的 LEA DX,BUF 被转换为 LEA DX,[000E]
但我认为应该是 LEA DX,[0000] 才对,请问为什么是 [000E]?























...全文
304 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
VxD1 2005-06-16
  • 打赏
  • 举报
回复
段组的问题,编译器把代码段放在数据段的前面了
phpsessid 2005-06-14
  • 打赏
  • 举报
回复
up
phpsessid 2005-06-06
  • 打赏
  • 举报
回复
在精简small内存模型和完整汇编格式中,他们的段定义是不同的,可以看出完整格式的数据段和指令段是分开,而small模型是混合在一起的,请搂主在debug的时候自行察看第一条指令的不同。

偶的flash还没有做,先闪咯。。。
phpsessid 2005-06-06
  • 打赏
  • 举报
回复
首先先道个歉,我主观猜测“使用small模型方式编制会占用前000d个地址”是错误的。
在经过试验以后得出如下结论:
1,使用各种内存模型方式的结果相同。
2,OFFSET指令将后面的BUF的偏移地址作为立即数回送给指令,而在执行时则将该偏移地址装入寄存器中,与LEA等价。
3,在只有LEA的指令的那个程序中,debug指令分配如下:

;1405:0000 B80514 MOV AX,1405
;1405:0003 8ED8 MOV DS,AX
;1405:0005 8D160E00 LEA DX,[000E]
;1405:0009 B44C MOV AH,4C
;1405:000B CD21 INT 21
1405:000D 0030 ADD [BX+SI],DH
1405:000F 3132 XOR [BP+SI],SI
1405:0011 3334 XOR SI,[SI]
1405:0013 353637 XOR AX,3736
1405:0016 3839 CMP [BX+DI],BH

这些指令在内存中分配如下:
B8 05 14 8E D8 8D 16 0E - 00 B4 4C CD 21 00 30 31
32 33 34 35 36 37 38 39
其中000E指向了 30 这条数据,正确。

4,在只有MOV的指令中,
1405:0000 B80514 MOV AX,1405
1405:0003 8ED8 MOV DS,AX
1405:0005 BA0C00 MOV DX,000C
1405:0008 B44C MOV AH,4C
1405:000A CD21 INT 21
1405:000C 3031 XOR [BX+DI],DH
1405:000E 3233 XOR DH,[BP+DI]
1405:0010 3435 XOR AL,35
1405:0012 36 SS:
1405:0013 37 AAA
1405:0014 3839 CMP [BX+DI],BH
内存数据:
B8 05 14 8E D8 BA 0C 00 - B4 4C CD 21 30 31 32 33
000C指向30 同样正确。

5,两指令同时存在情况下debug第一条指令为:MOV AX,1406 而不是MOV AX,1405 这是造成差异的原因。

6,可以看出,LEA和MOV offset指令的指令长度不同。。
phpsessid 2005-06-05
  • 打赏
  • 举报
回复
dataare segment
BUF DB '01234567891'
dataare ends

code segment

assume cs:code,ds:dataare

MAIN PROC FAR
start:
MOV AX,dataare
MOV DS,AX

LEA DX,BUF ;问题在这里

MOV AH,4CH
INT 21H
MAIN ENDP
code ends
END start
这样buf的偏移地址为0000,使用small模型方式编制会占用前000d个地址
大熊猫侯佩 2005-06-05
  • 打赏
  • 举报
回复
可能是你用模型编制,而不是用完整的段定义编制,否则该处的偏移应该为0。
而后者是被推荐使用的。
kanlejiuhao 2005-06-05
  • 打赏
  • 举报
回复
phpsessid(风随影动):使用small模型方式编制会占用前000d个地址——不明白


当我把 LEA DX,BUF 改为 MOV DX,OFFSET BUF 时,
debug程序中的相应语句变成了 MOV DX,000C

而当我同时写上 LEA DX,BUF 和 MOV DX,OFFSET BUF 时,
debug中的语句变成了 LEA DX,[0000] 和 MOV DX,0000
真是很奇怪!

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧