Linux 了解以下x86汇编代码
下面代码的输出是什么Linux 了解以下x86汇编代码,linux,assembly,x86,nasm,Linux,Assembly,X86,Nasm,下面代码的输出是什么 AND eax, 0 CALL $+0xA ENTER 0, 0 LAHF ADD eax, 0xC829 BSWAP eax SHR eax, 0x13 十六进制到十进制的转换- 0xA = 10 0xC829 = 51241 0x13 = 19 这是NASM语法汇编。您可以使用nasm-felf64(或者nasm-felf32组装它,然后使用objdump-drwC-Mintel分解生成的.o,并查看调用跳到添加 cal
AND eax, 0
CALL $+0xA
ENTER 0, 0
LAHF
ADD eax, 0xC829
BSWAP eax
SHR eax, 0x13
十六进制到十进制的转换-
0xA = 10
0xC829 = 51241
0x13 = 19
这是NASM语法汇编。您可以使用
nasm-felf64
(或者nasm-felf32
组装它,然后使用objdump-drwC-Mintel
分解生成的.o
,并查看调用跳到添加
call$+10
的调用目标比call
指令的开头提前10个字节:这就是NASM语法中$
的工作方式。+10
不是call
指令的rel32
机器码编码(相对于指令的末尾),它只是相对于源中的某个位置指定目标地址的一种方法,作为在那里放置标签的替代方法
您甚至可以将它与ld-o test.o
链接,并在GDB下运行生成的静态可执行文件。(使用starti
运行,但在第一条指令之前的断点处停止。使用layout reg
查看指令+寄存器值)
ld
查找一个\u start
符号,否则它默认将可执行文件的入口点设置为.text
部分的开头(默认情况下,NASM会将其汇编成该部分),因此,是的,nasm
+ld
可以在GDB下单步执行一些指令,而不需要额外的语法
当然,可执行文件不会干净地退出;没有代码进行退出系统调用。但我们只想在调试器中单步执行,甚至不调用printf或其他任何东西。您可以退出GDB,也可以继续,让它自动退出。您查看了说明了吗?你是在调试器中运行的吗?是什么给你带来了麻烦?PS:转换成十进制对你没有多大帮助。没有其他说明,它是一个“我们玩游戏好吗”类型的控制台。调试器无法运行这段代码,我对汇编没有任何了解,这段代码让我好奇,仅此而已。这是一个很好的谜语。您需要知道每条指令的长度,才能获得相对调用@zx485的目标,以及我如何找到每条指令的长度?@zx485:让我猜猜;它跳到后面的一个指令中间?或者它根本就不是ret
?哦,不,我只是用nasm-felf32
组装,然后用objdump-drwC-Mintel
反汇编,然后它跳转到add
@Z100:您不需要手动查找指令长度,只需组装它(并且可以选择链接它,以便您可以单步执行它,如果您需要的话)