1

我正在使用“lahf”将标志存储在 ah 中。我想输出这些值(1 和 0)来查看我的标志,但我不知道如何。下面代码中的我的 Holder 标签输出一个小数,有没有办法输出一个二进制数?还是我应该以不同的方式解决这个问题?

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
4

1 回答 1

2

你不能用printf. 您可以打印很容易与其二进制表示相关的十六进制(%02X例如)。

如果您坚持打印二进制文件,则必须为其编写一个函数。该功能将非常简单。如果您有n位,您可以循环n时间,移动1 并基于进位打印 0 或 1。更有效的是,您可以将结果存储在缓冲区中,然后使用%s.

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

到目前为止,我告诉了你两个极端:全部计算与全部存储。第一个可能很慢,第二个会占用大量空间(而且生成起来也很乏味)。

为了两全其美,您可以有一个表来存储半字节(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]);
}
于 2013-11-10T00:58:24.060 回答