打印一个字节的位

时间:2013-11-10 00:25:32

标签: 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]      ;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

1 个答案:

答案 0 :(得分:1)

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

如果您坚持打印二进制文件,则必须为其编写函数。功能很简单。如果你有n位,你可以循环n次,做shift乘1并基于进位打印0或1.更高效一点,你可以存储结果在缓冲区中,然后使用%s一次打印所有内容。

根据你拥有多少内存(因为它的x86不太可能(不可能?)它是嵌入的,所以你可能确实有很多内存),你也可以存储一张表格,其中包含' 0' - ' 1'字节的表示。对于8位值,该表将需要256 *(8 + 1)个字节(一个用于' \ 0'如果使用%s),您需要对其进行硬编码(可能生成与另一个程序)。

到目前为止,我告诉过你两个极端:计算所有vs存储全部。第一个可能很慢,第二个占用很多空间(生成也很繁琐)。

为了充分利用这两个方面,您可以拥有一个存储' 0' - ' 1'半字节的表示(4位)。那个表只有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]);
}