【问题标题】:Assembly, NASM; how is the information in 32 bit registers divided among sub registers?大会,NASM; 32位寄存器中的信息如何在子寄存器之间划分?
【发布时间】:2015-11-22 00:05:32
【问题描述】:

例如,EAX 分为 AX 和 AH 和 AL。所以如果我这样做:

push eax
mov eax, [szString] ;; where szString holds the string 'test'

那么 'test' 字符串如何在三个子寄存器中划分呢?例如,AX 持有什么? 有人可以解释一下为什么这是比特吗?例如,字符串“test”有多少位,它是如何分区的?

【问题讨论】:

  • mov eax, szString 在使用 NASM 时会将 szString 的地址移动到 EAX 而不是实际字符本身跨度>
  • 好的。如果我做 mov [eax], szString
  • 我以为 lea 移动了地址而 mov 移动了实际值?
  • 我想你的意思是mov eax,[szString] 在这种情况下,AL 将有第一个 t,AH 将有 e,AX 将有 et。自从我接触汇编程序以来可能已经有 15 到 18 年了,但无论如何我都记得。
  • 使用 NASM mov eax, szStringlea eax, [szString] 做同样的事情。如果您使用mov eax, [szString] 移动从指针 szString 开始的 4 字节内容,则字符将以相反的顺序放入 EAX 中。第一个字符将位于 EAX (AL) 的低 8 位,EAX 的高 8 位将包含第 4 个字符

标签: assembly x86 nasm endianness cpu-registers


【解决方案1】:

AL 将具有第一个 t,AH 将具有 e,AX 将具有 et(te 取决于您如何考虑较低的字符和较高的字符)。我接触汇编程序可能已经有 15 到 18 年了,但无论如何我都记得。

szString 在内存中会是这样的:

t    e    s    t
0x74 0x65 0x73 0x74

mov eax,[szString]

will have:
AL - 0x74
AH - 0x65
AX - 0x6574
EAX - 0x74736574

原始 ASCII 艺术:

[74][65][73][74]
[-----EAX------]
[--AX--]
[AL][AH]

【讨论】:

  • 我认为正确的答案将涉及对字节序的讨论或参考(x86 是小字节序)
  • 什么会有's'呢?
  • EAX 位于 AX 上方的下部,或位 16-23。 AX 是 EAX 的最低有效 16 位(位 0-15)。
  • 谢谢。这对我的理解非常有用!
  • 考虑到每个字符最多 8 位长并且堆栈向低地址增长,最终点击,但这里它被反向推送。
猜你喜欢
  • 2015-12-26
  • 2014-11-18
  • 2015-06-25
  • 2020-11-21
  • 2014-12-17
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
相关资源
最近更新 更多