2012-04-03 33 views
1

我想輸入一個字符串像415A6B31和彙編函數應該返回AZk1 所以我必須採取每兩個字節並轉換爲一個字節... 41 = A 5A = Z等上程序集十六進制表示從兩個字節

如何使它在組裝?

+3

的數據被改變一樣的,唯一的一點是,你如何看待它 – BlackBear 2012-04-03 19:47:19

+0

假設8個字符的ASCII十六進制字符串,你是如何傳遞的? EAX中的指針? – 2012-04-03 20:02:51

+0

在字符串中輸入4是0x34十六進制,並且1是0x31十六進制,所以如果我有一個寄存器ebx想要輸入值0x34和0x31到第一個字節......怎麼做? – aseed 2012-04-03 22:25:21

回答

0

看看你正在處理的數字。該字符串是在十六進制是嗎?查找十六進制值0-9是0x30到0x39,用0xF得到0-9是嗎?安定的0x41與0xF不會導致雖然是0xA,因此對於字符串

if(byte>0x39) byte = byte - 7; 
byte=byte&0xF; 

,讓你啃每個字節(半字節)爲0x4,0x1,則0x5的,是0xA,等於是半字節組合成字節

(0x4<<8)|0x1 = 0x41, (0x5<<4)|0xA = 0x5A, etc. 

C語言符號:

<< means shift left 
& means and 
| means or 
- means subtract 
0x means the number is in hexadecimal 
+0

我認爲還有另一種方式, nybbles .. – aseed 2012-04-04 10:52:43

+0

兩種選擇,一次只有一個源字符(半字節)或一次有兩個字符(字節)在一次要執行兩個字符時使用65536深度查找表。 answer = table [(((uint16_t)source [n + 0])<< 8)| source [n + 1])];如果你不使用查找表,那麼你基本上將它分解成小節並將它們放在一起。除了if> 0x39 x- = 7;是一個256深查找表(獲取半字節)。 – 2012-04-04 14:22:23

+0

我真的不明白你的答案,因爲它的符號,就像byte = 7 byte&= 0xF和<< and | – aseed 2012-04-10 20:11:16