2013-04-03 123 views
0

在x86彙編語言中,是否有任何有效的方法將字節轉換爲二進制數字字符串(表示爲0和1的字節數組)?據我所知,x86彙編中沒有任何'toString'函數,就像大多數高級編程語言一樣。將字節轉換爲x86彙編語言的字符串

.stack 2048 

.data 
theString byte 0, 0, 0, 0, 0, 0, 0, 0 ;store eax as a binary string here. 
ExitProcess proto, exitcode:dword 

.code 
start: 
mov eax, 3; 
;now I need to convert eax to a binary string somehow (i. e., a byte array of 0s and 1s) 
invoke ExitProcess, 0 
end start 
+0

至少它能夠獲得從寄存器的第一位x86彙編語言:http://stackoverflow.com/questions/15238467/get-the-first -eax-register-in-x86-assembly-language –

+1

如果你的意思是轉換eg值13到字符串「1101」,然後看到我的答案http://stackoverflow.com/questions/15786970/mips-decimal-to-binary-conversion-code-is-working-but-result-must-be- revers-ho/15787423#它可以在x86環境和'SHL' /'JC'組合上相當高效地完成。 – Michael

+0

@Michael該問題討論了MIPS程序集而不是x86程序集。 –

回答

1

是不是那麼難?:

.data 
mystr db 33 dup(0) 

.code 

EaxToBinaryString: 
    mov  ebx, offset mystr 
    mov  ecx, 32 
EaxToBinaryString1: 
    mov  dl, '0' ; replace '0' with 0 if you don't want an ASCII string 
    rol  eax, 1 
    adc  dl, 0 
    mov  byte ptr [ebx], dl 
    inc  ebx 
    loop EaxToBinaryString1 
    ret 
0

使用SSE內在,人們可以編碼此像:

char in[2]; 
char string[16]; 
__m128i zeroes = _mm_set1_epi8('0'); 
__m128i ones = _mm_set1_epi8('1'); 
__m128i mask = _mm_set_epi8(
    0x80, 0x40, 0x20, 0x10, 8, 4, 2, 1, 
    0x80, 0x40, 0x20, 0x10, 8, 4, 2, 1); 
__m128i val = _mm_set_epi8(
    in[1], in[1], in[1], in[1], in[1], in[1], in[1], in[1], 
    in[0], in[0], in[0], in[0], in[0], in[0], in[0], in[0]); 

val = _mm_cmplt_epi8(val, _mm_and_si128(val, mask)); 
val = _mm_or_si128(_mm_and_si128(val, zeroes), _mm_andnot_si128(val, ones)); 
_mm_storeu_si128(string, val); 

代碼執行以下步驟:

  • 複製2字節輸入到的所有字節XMM寄存器,_mm_set1_epi...()
  • 創建一個掩碼,從每個單詞中提取一個不同的位
  • 使用並行提取位和
  • 比較(低於)提取的位與掩碼。
    結果是0xffff0x0的數組,如果該位清零或設置。
  • 提取使用該蒙版的'0''1'個字符,將它們合併。
  • 寫所得字節數組出

這與換檔和測試序列得到了,但在該擴展到幾SSE各指令序列的_mm_set*()的價格。它比128位迭代的位測試循環更快。

+0

這是哪種類型的彙編語言語法?我不認識它。 (我通常使用MASM語法,所以我現在有點困惑。) –

+0

不是彙編 - 編譯器_intrinsics_,http://software.intel.com/en-us/articles/how-to-use-intrinsics –

+0

I.e.上面可以用_compiled_(用C/C++編譯器和'#include ');編譯器用SSE指令完全匹配一些SSE內在函數('_mm_or ...'='POR','_mm_cmplt ...'='PCMPGT'),其他操作數也被替換,...​​)指令序列('_mm_set ...')。在許多情況下,首先編寫和測試帶有內部函數的x86 SIMD代碼,然後轉儲到普通/純粹的彙編函數中更容易... –