【问题标题】:Printing the hexadecimal value of assembly registers, moving 16 bit registers into 8 bit ones and other assembly questions打印汇编寄存器的十六进制值,将 16 位寄存器移动到 8 位寄存器和其他汇编问题
【发布时间】:2014-05-25 21:57:51
【问题描述】:

我正在编写一个函数来打印我的 16 位实模式汇编操作系统中的每个寄存器。我遇到了一些问题:

1 将 16 位寄存器移入 8 位寄存器

mov al, bx

这给了我error: invalid combinations of opcodes and operands。无论如何我可以做到这一点吗?

2 将值移动到ax 是否会影响ah 和/或al

mov ah, 0x5
mov al, 0x10
mov ax, 0x20

ah 是否仍保持 0x5 和 al 保持 0x10?

3 打印寄存器的十六进制值而不是 ascii 码?

mov ah, 0x0e
mov al, 0x4d
int 0x10

这会输出字符“m”而不是 0x4d 或 77 或 1001101 等。是将 4d 转换为 0x34 和 0x64 然后打印的唯一选项吗?

【问题讨论】:

    标签: assembly operating-system cpu-registers 16-bit real-mode


    【解决方案1】:
    1. 由于 16 位不适合 8 位,因此您不能这样做。使用适当的 8 位寄存器,例如 mov al, bl。反过来,您可以使用movzxmovsx 进行零或符号扩展。
    2. 是的,ALAHAX 的两半(对于其他寄存器类似,并进一步扩展到 32 位和 64 位寄存器)。
    3. 你需要转换,是的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 2020-11-21
      相关资源
      最近更新 更多