【发布时间】:2020-03-06 16:09:32
【问题描述】:
我需要用C语言设计一个函数来实现机器码写的东西。我分步进行组装操作,但据说我的功能实现错误。我很迷惑。
这是函数的反汇编代码。
(Hand transcribed from an image, typos are possible
especially in the machine-code. See revision history for the image)
0000000000000000 <ex3>:
0: b9 00 00 00 00 mov 0x0,%ecx
5: eb 1b jmp L2 // 22 <ex3+0x22>
7: 48 63 c1 L1: movslq %ecx,%rax
a: 4c 8d 04 07 lea (%rdi,%rax,1),%r8
e: 45 0f b6 08 movzbl (%r8),%r9d
12: 48 01 f0 add %rsi,%rax
15: 44 0f b6 10 movzbl (%rax),%r10d
19: 45 88 10 mov %r10b,(%r8)
1c: 44 88 08 mov %r9b,(%rax)
1f: 83 c1 01 add $0x1,%ecx
22: 39 d1 L2: cmp %edx,%ecx
24: 7c e1 jl L1 // 7 <ex3+0x7>
26: f3 c3 repz retq
我的代码(函数的签名没有给出或解决):
#include <assert.h>
int
ex3(int rdi, int rsi,int edx, int r8,int r9 ) {
int ecx = 0;
int rax;
if(ecx>edx){
rax = ecx;
r8 =rdi+rax;
r9 =r8;
rax =rsi;
int r10=rax;
r8=r10;
rax =r9;
ecx+=1;
}
return rax;
}
如果您发现任何错误,请解释导致错误的原因。
【问题讨论】:
-
r寄存器是 64 位的。int是 x86-64 C 实现中的 32 位类型。如果它实际上是int,你会使用int edi,就像你对edx所做的那样。更重要的是,asm 包含一个向后条件分支,但您的 C 缺少一个循环。此外,asm 有一堆从内存中加载的零扩展字节,但你的 C 没有任何指针变量。 -
请编辑您的问题以包含 asm 代码。不要发布指向图片的链接,也不要用图片本身替换该链接。花点时间在问题中输入它。
-
那个 ASM 代码看起来像一个循环。
-
我对您的问题投了反对票,因为您发布了一张代码图片。一旦您将其替换为文本形式的代码,将删除我的反对票。
-
@fuz:Steve Friedl 努力将图片翻译成文字。我删除了图片,所以现在问题应该没问题了。
标签: c assembly x86-64 reverse-engineering