首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

请问一个如何想都想不通的地址偏移有关问题

2012-02-21 
请教一个怎么想都想不通的地址偏移问题//myfile.asm//照抄书上的代码THEFORMOFANASSEMBLYLANGUAGEPROGRAM

请教一个怎么想都想不通的地址偏移问题
//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等)来定位要查看的数据。

热点排行