【问题标题】:Getting the address of a variable initialized in the data section获取数据部分中初始化的变量的地址
【发布时间】:2021-06-13 17:50:32
【问题描述】:

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

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 节的存在会影响 print 语句 2 打印的字符。我在 64 位平台的 QEMU 中对此进行了测试。有人可以帮我解决这个问题吗?

提前谢谢你

【问题讨论】:

  • 因为您的数据在代码之后,所以如果您增加代码大小,您的数据将相应移动。
  • 您打印的是地址,而不是数据,这取决于之前的所有内容。看反汇编或列表。 (nasm -fbin -l /dev/stdout foo.asm)
  • @PeterCordes 是的,几乎明白了。您的意思是,即使代码指令也会存储在内存中的某个位置,这会影响在数据段中初始化的变量的地址?
  • 是的,当然。 CPU 从内存运行指令;这就是使它们可编程的原因。 (en.wikipedia.org/wiki/Stored-program_computer)。 add al,65 在该位置向输出发送 2 个字节,与 db 0x04, 0x41 的 2 个字节完全相同。看清单。整个 512 字节的 MBR 引导扇区被加载到线性地址 0x7C00 的内存中,然后 BIOS 跳转到该地址。机器代码与数据的使用量取决于您自己,但执行从其顶部开始。

标签: assembly nasm x86-16 memory-address


【解决方案1】:

数据部分

中的变量寻址

我相信您的困惑源于您的变量位于单独的“数据”部分的想法。

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

但是您当前的引导扇区代码要简单得多。您根本没有使用部分。您编写的所有内容都会在原处编码。

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

在没有“第 2 节指令”的情况下,char1 变量的地址将为 19。这是 17 加上来自 jmp $ 指令的 2 个字节。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    相关资源
    最近更新 更多