【问题标题】:Assembly byte ptr meaning汇编字节ptr含义
【发布时间】:2017-12-14 23:41:23
【问题描述】:

ecx 我有一些字符串,比如"abc"

mov ah, BYTE PTR [ecx+0]
mov al, BYTE PTR [ecx+1]

它到底是做什么的?就像在ah 我有"a" 而在al 我有"b"

【问题讨论】:

  • 如果ecx是一个指向你的字符串的指针,那么是的。你怎么没试过?
  • 如果您在ecx 中有字符串本身,那么不,不清楚该代码会做什么,可能会在无效内存访问时崩溃,因为字符串“abc”很可能不会形成您的进程可以访问的内存地址。但是您很可能是说“我在 ecx 中有字符串的内存地址”,那么它会按照您的想法进行。正如 Jester 所写,您应该自己尝试这些,至少您将练习使用调试器。

标签: assembly x86


【解决方案1】:

有时我们需要帮助汇编程序翻译对内存中数据的引用。

byte ptr -> 它只是意味着你想从地址中获取一个字节。 如果它说word ptrdword ptr,你会从源索引中的地址得到一个word 或dword。

当您需要类似byte ptr 示例时,您可以将立即值移动到间接地址:

mov ebx, OFFSET some_symbol    ; or a pointer from another register
mov [ebx], 10

这通常是不允许的——汇编器不知道您是否希望将 10 作为 byteword、双字或(在 64 位代码中)四单词。 You need to make it explicit 有尺寸规格:

mov byte ptr [ebx], 10  ; write 10 into a byte
mov word ptr [ebx], 10  ; write 10 into a word
mov dword ptr [ebx], 10 ; write 10 into a dword

【讨论】:

  • OP 使用的是 32 位代码,无需使用 16 位示例。另外,[dx] isn't even a valid 16-bit addressing mode.。此外,您上次的编辑覆盖了我的拼写/其他改进编辑。
  • @PeterCordes 已修改☺ 这是我第四次在 Stack Overflow 问题答案中绊倒你!现在可以接受吗?
  • 您上次的编辑让情况变得更糟。 byte ptr dx 在任何 asm 语法中均无效。我会解决的。
【解决方案2】:

byte ptr 表示内存操作数指的是内存中的一个字节,而不是一个字或双字。通常,这可以省略,因为汇编器可以从使用的寄存器推断操作数大小,但有一些指令,如 mov [eax],0 无法推断大小,因此需要 byte ptrword ptrdword ptr 前缀。

【讨论】:

  • 或者使用 MASM 之类的汇编程序,我认为您需要 mov al, byte ptr [my_dword_location] 来根据您声明数据的方式覆盖与标签关联的隐含操作数大小,如果您想加载的大小不t 匹配 dwordbyte 或标签后面的任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 2011-03-27
  • 1970-01-01
  • 2013-10-18
  • 2012-12-14
  • 1970-01-01
相关资源
最近更新 更多