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