![](/img/trans.png)
[英]Initializing the data segment Register in assembly 8086 using masm compiler
[英]Assembly: Using the Data Segment Register (DS)
目前我正在学习x86组装以获得乐趣,我喜欢微控制器编程,所以我熟悉汇编。
目前我一直在寻找这个问题的答案的高低,但似乎无法找到它...... DS寄存器,我知道它应该指向我程序中的全局数据,但我不知道知道它是如何工作的。 我正在使用NASM,在大多数简单的程序中,我看到以下内容:
[org 0x7C00] [bits 16] main: mov ax, 0x0000 mov ds, ax mov 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以及更多地方找到更多。
BTW,“msg”应位于或多或少位于0x7C11地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.