从 x86 汇编程序调用 C 函数



我正在尝试编写一个在汇编器中将十进制数转换为二进制的函数。由于打印在那里非常麻烦,我决定在 C 中创建一个单独的函数来打印数字。但是当我运行代码时,它总是打印"0110101110110100"

下面是 C 函数(打印和转换(:

void printBin(int x) {
printf("%d", x);
}
void DecToBin(int n)
{
// Size of an integer is assumed to be 16 bits
for (int i = 15; i >= 0; i--) {
int k = n >> i;
printBin(k & 1);
}

以下是 ASM 中的代码:

.globl _DecToBin
.extern _printBin
_DecToBin:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp),%eax
movl $15, %ebx
cmpl $0, %ebx
jl end
start:
movl %ebx, %ecx
movl %eax, %edx
shrl %cl, %eax
andl $1, %eax
pushl %eax
call _printBin
movl %edx, %eax
dec %ebx
cmpl $0, %ebx
jge start
end:
movl %ebp, %esp
popl %ebp
ret

无法弄清楚错误在哪里。任何帮助将不胜感激

使用在线程序反汇编代码

您的主要问题是,在对 printBin 的函数调用中不太可能保留 %edx。 也:

%ebx 在大多数(任何?C 调用约定规则。 您需要检查编译器文档并遵守它。 如果要使用ebx,则需要保存并还原它。

堆栈指针需要与 16 个字节保持对齐。 在我的机器(macos(上,如果您不这样做,它会在打印箱下使用SEGV。

最新更新