gpt4 book ai didi

汇编:使用数据段寄存器(DS)

转载 作者:行者123 更新时间:2023-12-02 18:01:05 28 4
gpt4 key购买 nike

目前我正在学习 x86 汇编,因为我喜欢微 Controller 编程,所以我对汇编很熟悉。

目前我一直在到处寻找这个问题的答案,但似乎找不到它...... DS寄存器,我知道它应该指向我程序中的全局数据,但我不知道它到底是如何工作的。我正在使用 NASM,在大多数简单的程序中我看到以下内容:

[org 0x7C00][bits 16]  main:mov ax, 0x0000mov ds, axmov al, [msg]  mov ah, 0x0E  mov bx, 0x0007  int 0x10    jmp $  msg db 'X'times 510-($-$$) db 0  dw 0xAA55

并且效果很好(即使我省略了粗体代码),但是如何呢? CPU是否自动加载从0x0000开始的全局变量?或者我缺少什么内在的东西?

最佳答案

当计算机处于实模式(BIOS执行引导加载程序时CPU所处的模式)时,CPU计算地址的方法非常简单:将段寄存器值乘以16(将位移4位到左),然后添加偏移量。

例如,在“mov ax, [0x1234]”这样的指令中,CPU 将使用“DS * 0x10 + 0x1234”作为有效地址(在您的情况下,第一项解析为零。)当您有类似“mov ax, [BP+0x32]”那么CPU将使用“SS * 0x10 + BP + 0x32”。请注意,现在 CPU 使用了不同的段寄存器(堆栈段),这是因为当使用 BP 寄存器时,CPU 默认情况下假设您不想访问堆栈(但您可以通过使用 [DS :BP + 0x32])。

更多或更少我已经解释过的内容,更多内容可以在 http://wiki.osdev.org/Real_Mode 找到。和 http://www.internals.com/articles/protmode/realmode.htm以及更多的地方。

顺便说一句,“msg”应该或多或少位于 0x7C11 地址。

关于汇编:使用数据段寄存器(DS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4903906/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com