汇编。将值打印为二进制

时间:2016-03-02 18:03:55

标签: assembly nasm

是否有指令将汇编程序中的值打印为二进制文件?到目前为止,我只找到了使用ASCII字符的说明。

我正在使用NASM。

我一直在使用。

mov ecx, var0
mov edx, 1
mov ebx, 1
mov eax, 4
int 0x80

打印

1 个答案:

答案 0 :(得分:2)

不,没有。但是,您可以为此编写一个相当简单的函数。因为我不在我的Linux机器上,所以我现在不能这样做,但这就是我要做的:

首先,psuedocode。首先,我们假设我们正在打印一个4位数字。比如说b1010 =(十进制10)。我们首先要:

  1. b1010& b1000 = b1000
  2. b1010& b0100 = b0
  3. b1010& b0010 = b10
  4. b1010& b0001 = b0
  5. 所以在我看来,有了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
    

    无论如何,这就是目标。