【问题标题】:Subtract of two char into rax将两个字符减去 rax
【发布时间】:2016-03-27 14:41:15
【问题描述】:

当我这样做时:

endnf:
    add al, BYTE[rdi]
    sub al, BYTE[rsi]
    jmp end

当 BYTE[rdi] = 116 且 BYTE[rsi] = 122 时,结果为 250 而不是 -6,因为 al = sizeof(char)

所以我尝试了:

endnf:
    add rax, BYTE[rdi]
    sub rax, BYTE[rdi]
    jmp end

但我不工作:

nasm -f elf64 strcmp.s                            16:31:07
strcmp.s:24: error: invalid combination of opcode and operands

rdi[0] 和 rsi[0] 相减应该怎么做?

【问题讨论】:

  • 250 在 8 位二进制补码中是 -6。如果您想要更大的结果,请签名扩展它,例如movsx rax, al

标签: assembly nasm x86-64


【解决方案1】:

错误源于您应该编写 ... rax, qword ptr [...] 以获得匹配大小的操作数。

我不明白您为什么要编写 add 指令来获取 [rdi] 处的值。

最简单的解决方案是:

mov   al, [rdi]
sub   al, [rsi]
movsx rax, al

如果你写下几行,你会得到相同的结果。这很愚蠢,但它确实在 AL 中留下了相同的结果,可以像以前一样扩展以满足您的需求。

mov   rax, [rdi]
sub   rax, [rsi]
movsx rax, al

【讨论】:

  • rax,[rdi]的用法不一样!它读取四个字节,而不仅仅是一个带符号扩展的字节。
  • @RudyVelthuis (1) 为什么mov rax,[rdi] 只能读取四个字节? (2) 我没有看到@SepRoland 声称该指令读取一个带符号扩展的字节。他只是说整个代码sn-p结束时RAX中的结果是一样的。这是真的。只有 RFLAGS(很可能)会有所不同!
  • Ad (2): 不,但是读取一个字节(这是正确的)然后对其进行符号扩展,或者读取 8 个字节并或多或少地丢弃前 7 个字节是有区别的。可能不允许读取 8 字节。
猜你喜欢
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 2012-10-28
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多