Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 了解以下x86汇编代码_Linux_Assembly_X86_Nasm - Fatal编程技术网

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:您不需要手动查找指令长度,只需组装它(并且可以选择链接它,以便您可以单步执行它,如果您需要的话)