我已经查看了ref.x86asm.net手册,虽然它有很多信息,但由于我不知道怎么做,所以我无法做出正面或反面的信息。解释寄存器。
我正在使用64位代码并且附近有一行,lldb向我展示了以下内容:
48 89 e5 movq%rsp,%rbp
我从上面的语句中得知89是移动命令。 rsp是源码,rbp是目的地(我在osx上)。
在ref.86asm手册中,它指出" 89" o有' r'和op1有r / m16 / 32/64。 op2有r16 / 32/64 我查看了这些价值观,但我真的不明白它应该如何运作。我在其他人的答案中看到了对REX的引用,但我不知道这意味着什么。
XX 89 XX movq%rax,%rdi;我该怎么做呢?什么是XX?
我正在编写自己的字节代码,并通过编写c,编译它然后在lldb中查看它来解决大部分问题。但是,如果我能更好地理解字节代码在引用寄存器时是如何工作的,那么我可以节省大量时间。
答案 0 :(得分:3)
手动确定比较困难,所以当我必须这样做时,我会在汇编文件中编写指令,汇总并检查输出。我个人使用nasm。
您的文件看起来像这样(请注意,这是英特尔语法,而不是像您的示例中的AT& T):
[BITS 64]
main:
mov rdi, rax
关闭我的头,用nasm file.asm -f bin -o output
编译,然后用十六进制编辑器打开output
。 (-f bin
告诉nasm做一个平面二进制文件,这是一个只是原始机器代码的二进制文件。)
纳斯姆只是其中之一。对于单指令测试,Keystone可能更容易。或者,您可以获得pwntools and use the asm
module。
基本思想是:使用汇编程序而不是试图手工弄清楚。
答案 1 :(得分:0)
您可以使用汇编程序(as
)来计算字节数,并使用otool
打印它们:
:; echo 'movq %rax, %rdi' | as
:; otool -tvj a.out
a.out:
(__TEXT,__text) section
0000000000000000 4889c7 movq %rax, %rdi
请注意,默认情况下as
会写入文件a.out
。