【发布时间】: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