是否有指令将汇编程序中的值打印为二进制文件?到目前为止,我只找到了使用ASCII字符的说明。
我正在使用NASM。
我一直在使用。
mov ecx, var0
mov edx, 1
mov ebx, 1
mov eax, 4
int 0x80
打印
答案 0 :(得分:2)
不,没有。但是,您可以为此编写一个相当简单的函数。因为我不在我的Linux机器上,所以我现在不能这样做,但这就是我要做的:
首先,psuedocode。首先,我们假设我们正在打印一个4位数字。比如说b1010 =(十进制10)。我们首先要:
所以在我看来,有了4位数字,我们需要&amp;每个位用1 <&lt;&lt; (4-i)其中i是索引。如果它不为零,则返回1.否则,返回0。
现在,我们只有1或0,但我们需要实际添加它来获取字符串值。最简单的方法是添加ascii值'0',即48d或0x30。在python中,这将以二进制打印出来:
print("\x31\x30\x31\x30")
。
现在,我们在C:
进行void printBinary(uint32_t n) {
for (size_t i = 1; i <= 32; ++i)
if (n & (1 << (32 - i)))
printf("%c", 0x30 + 1);
else
printf("%c", 0x30 + 0);
}
没有测试,这是我能想到的最好的:
printBinary:
push ebp
mov ebp, esp
mov esi, [ebp+8] ;// __cdecl calling convention. get parameter from the stack
mov ecx, 1 ;// This will be used for our counter
.loop:
mov eax, 1 ;// 1 will be shifted
mov ebx, 32 ;// 32 is the size of the number we are printing
sub ebx, ecx ;// offset from the counter.
shl eax, ebx ;// shift left. This is the 1 << (32 - i) part in C.
and eax, esi ;// and it
test eax, eax ;// if it is zero...
jz .print ;// then print '0'
mov eax, 1 ;// otherwise, print '1'
.print
push ecx ;// save ecx counter for later
mov ecx, eax
add ecx, 0x30
mov eax, 4 ;// syscall for output
mov ebx, 1 ;// stdout
mov edx, 1 ;// only printing one byte
int 0x80 ;// call the kernel
pop ecx ;// replace the counter
inc ecx
cmp ecx, 32
jle .loop
mov esp, ebp
pop ebp
ret
这在某种程度上很可能是不正确的,因为我还没有测试它,但希望这给你一个可以遵循的结构。希望你可以用:
来调用它push 10
call printBinary
无论如何,这就是目标。