获取在数据部分初始化的变量的地址

问题描述

我已经开始了解汇编语言。我试图了解数据部分中变量的内存布局和寻址并编写了以下代码

mov bx,char1  ;copies the address to register bx

mov ah,0Eh

mov al,bh       ;moves the higher bit to al

add al,65       ;added 65 to al to see a recognizable asci character on screen

int 10h         ;print statement 1

mov al,bl       ;moves the lower bit to al

add al,50

int 10h         ;**print statement 2**


;**section 2 start**

mov bx,char2

;**section 2 end**


jmp $

char1: db "X"
char2: db "Y"

times 510 - ($-$$) db 0
dw 0xaa55

据我所知,char1 指向内存中的一个字节,char2 指向下一个字节。但是我不知道为什么第 2 节的存在会影响打印语句 2 打印的字符。我在 64 位平台的 QEMU 中对此进行了测试。有人可以帮我克服这个问题吗?

提前致谢

解决方法

数据部分

中变量的寻址

我相信您的困惑源于这样一种想法,即您的变量位于单独的“数据”部分。

许多汇编程序允许您将程序组织成多个部分,例如 .stack.data.code,如果您进行这种编程,那么插入额外指令后数据项不会改变。

但是您当前的引导扇区代码要简单得多。您根本没有使用节。您编写的所有内容都会在其所在位置进行编码。

打印地址的代码占 17 个字节。

在“第 2 节指令”的省略部分中,char1 变量的地址将为 19。即 17 加上来自 jmp $ 指令的 2 个字节。

通过插入“第 2 节指令”,char1 变量的地址变为 22。即 17 加上来自 mov bx,char2 的 3 个字节加上来自 jmp $ 指令的 2 个字节。

ps 我假设在打印代码之前什么都没有...