2013-11-10 38 views
1

我正在用「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

無法使用printf打印二進制文件。你可能打印十六進制十分容易涉及到它的二進制表示(例如%02X)。

如果你堅持打印二進制文件,你將不得不爲它寫一個函數。該功能將非常簡單。如果您有n位,則可以循環n次,執行shift加1,並基於進位打印0或1.更有效一點,您可以將結果存儲在緩衝區中,然後使用%s 。根據你有多少內存(因爲它是x86,它不太可能(不可能?)它被嵌入,所以你可能有很多內存),你也可以存儲一個表'0' - '1 '字節的表示。對於8位值,該表需要256 *(8 + 1)個字節(如果使用%s,則爲'\ 0'),您需要對其進行硬編碼(可能使用其他程序生成)。

到目前爲止,我告訴過你兩個極端:計算所有vs商店全部。第一個可能很慢,第二個需要很多空間(並且生成繁瑣)。

爲了獲得兩全其美的效果,您可以有一張存儲半字節(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]); 
}