Assembly 打印字节的位

Assembly 打印字节的位,assembly,x86,Assembly,X86,我用“lahf”来储存国旗啊。我想输出这些值(1和0)以查看我的标志,但我不知道如何输出。我的持有者标签在下面的代码中输出一个十进制数,有没有办法改为输出一个二进制数?或者我应该用另一种方式来处理这个问题 lahf ;moves flags to ah mov [flagg], ah ;moves flags to label "flagg" in .bss (reserved 1 dword) ;later on... mov eax,[flagg

我用“lahf”来储存国旗啊。我想输出这些值(1和0)以查看我的标志,但我不知道如何输出。我的持有者标签在下面的代码中输出一个十进制数,有没有办法改为输出一个二进制数?或者我应该用另一种方式来处理这个问题

lahf                 ;moves flags to ah
mov [flagg], ah      ;moves flags to label "flagg" in .bss (reserved 1 dword)


;later on...
mov eax,[flagg]      ;moves the flag values into eax
push eax             ;pushes eax onto stack
push Holder          ;Holder is a label in .data ( "%d",0 )
call printf          ;prints to screen
add esp, 8

无法使用
printf
打印二进制文件。您可以打印十六进制,这很容易与其二进制表示形式相关联(例如使用
%02X

如果您坚持打印二进制文件,则必须为其编写一个函数。该函数将非常简单。如果您有
n
位,您可以循环
n
次,按1执行a,并根据进位打印0或1。更有效的是,您可以将结果存储在缓冲区中,然后使用
%s
一次打印所有结果

根据您有多少内存(因为它是x86,不太可能(不可能?)嵌入,所以您可能有很多内存),您还可以存储一个具有字节“0”-“1”表示形式的表。对于8位值,该表需要256*(8+1)个字节(如果使用
%s
,则为“\0”一个字节),并且需要硬编码(可能使用其他程序生成)

到目前为止,我告诉过你两个极端:全部计算和全部存储。第一个可能很慢,而第二个则需要很大的空间(而且生成起来也很乏味)

为了充分利用这两个方面,您可以使用一个表来存储半字节(4位)的“0”-“1”表示形式。该表仅为16*(8+1)字节。打印一个字节将首先打印其最高有效位,然后打印其最低有效位

在C中,这将如下所示:

const char *bit_rep[16][5] = {
    [ 0] = "0000", [ 1] = "0001", [ 2] = "0010", [ 3] = "0011",
    [ 4] = "0100", [ 5] = "0101", [ 6] = "0110", [ 7] = "0111",
    [ 8] = "1000", [ 9] = "1001", [10] = "1010", [11] = "1011",
    [12] = "1100", [13] = "1101", [14] = "1110", [15] = "1111",
};

void print_byte(uint8_t byte)
{
    printf("%s%s", bit_rep[byte >> 4], bit_rep[byte & 0x0F]);
}