请教一个怎么想都想不通的地址偏移问题
//myfile.asm//
照抄书上的代码
;THE FORM OF ANASSEMBLY LANGUAGE PROGRAM
;NOTE: USAGE SIMPLIED SEAGMENT DEFINITION
.MODEL SMALL
.STACK 64
.DATA
DATA1 DB 52H
DATA2 DB 29H
SUM DB ?
.CODE
MAIN PROC FAR ;this is the program entry point
MOV AX, @DATA ;load the data seagmentaddress
MOV DS, AX ;assign value to DS
MOV AL, DATA1 ;get the first operand
MOV BL, DATA2 ;get the second operand
ADD AL, BL ;add the operands
MOV SUM, AL ;store the result in location SUM
MOV AH, 4CH ;set up to return to DOS
INT 21H ;
MAIN ENDP
END MAIN ;this is the program exit point
在msdos7.1系统下,编译器是masm510 处理器是amd athlonX64 X2 mobile
(似乎不可能与处理器有关,因为基本的处理器都兼容8086/88指令集
masm myfile.asm 通过 没有任何警告和错误
link myfile.obj 通过
运行debug myfile.exe
-u cs:0 19 得到代码段起始地址为1429H,数据段起始地址为1430H,
(请问这里正常不?)
-d 1430:0 f
查看一下代码段前16字节的内容,这里我就百思不解为什么1430:0000不等于52H,1430:0001不等于29H,似乎52H偏移到1430:0006 29H偏移到1430:0007,因为我运行
-g 之后
1430:0008的内容为7BH
哪位知道的给我说一下啊,谢谢,可以在这里回帖也行,给发消息也行
13816724892
------解决方案--------------------
我在我的机子上试了一下:MASM6.15+WINDOWSXP
它将:
MOV AL, DATA1
MOV BL, DATA2
翻译成;
MOV AL, [0006] ;DATA1的偏移地址为0006
MOV BL, [0007] ;DATA2的偏移地址为0007
我将程序改为显示的定义代码段:
;THE FORM OF ANASSEMBLY LANGUAGE PROGRAM
;NOTE: USAGE SIMPLIED SEAGMENT DEFINITION
.MODEL SMALL
.STACK 64
data segment
DATA1 DB 52H
DATA2 DB 29H
SUM DB ?
data ends
code segment
assume ds:data, cs:code
start:
mov ax, data
mov ds, ax
MOV AL, DATA1 ;get the first operand
MOV BL, DATA2 ;get the second operand
ADD AL, BL ;add the operands
MOV SUM, AL ;store the result in location SUM
MOV AH, 4CH ;set up to return to DOS
INT 21H ;
code ends
end start
MOV AL, DATA1
MOV BL, DATA2
翻译成;
MOV AL, [0000] ;DATA1的偏移地址为0000
MOV BL, [0001] ;DATA2的偏移地址为0001
出现这种情况是不是和.DATA伪指令或者是MOV AX, @DATA这条语句有关,初学不对之处请原谅!!!
[解决办法]
编译器不一样,出来的结构不一样,是不是因为地址对齐问题?
[解决办法]
貌似加上 org 1 伪指令,就能按你的想法放置数据。
[解决办法]
Loader是随机放的,不好讲道理。
[解决办法]
> -u cs:0 19 得到代码段起始地址为1429H,数据段起始地址为1430H,
(请问这里正常不?)
这个先后顺序无关紧要,无所谓。因为加载的位置是不确定的,受到很多因素的影响。
> -d 1430:0 f
查看一下代码段前16字节的内容,这里我就百思不解为什么1430:0000不等于52H,1430:0001不等于29H,似乎52H偏移到1430:0006 29H偏移到1430:0007,因为我运行
-g 之后
1430:0008的内容为7BH
你查看一下DS和SI\DI的值,他们一定指向
DATA1 DB 52H
DATA2 DB 29H
small模式的程序非常不好确定变量的位置,数据,代码和堆栈都压缩合并到了一起,唯一的查找方法就是通过段寄存器和偏移寄存器(SI,DI,IP,BP,SP等)来定位要查看的数据。