2013-06-28 46 views
0

我有存儲在寄存器中的十六進制值,例如此一:從十六進制表達式中獲取單個字符?

mov ax,1234h 

我需要每個字符(1,2,3,4)與十進制值比較,理想的我將通過字符環/號碼,但我不知道如何指向每一個,或者甚至可能。如何才能做到這一點?

回答

0

給出一個數字,如1234H 16分它,得到的餘數,這是你第一次右擊,數量最多的

如果分割的結果不爲零後,重複使用部門作爲的結果,你的數。

這是衆所周知的鹼基轉換算法。你可以在維基百科上查找它。 http://en.wikipedia.org/wiki/Hexadecimal

1

這是彙編語言,因此沒有一條指令可以完成此操作。有幾個步驟。可能最具時效性的方式將被描述如下。如果需要,第一步是保存值,因爲其餘代碼將會破壞它。這些步驟是有點不精確,但給的一般算法:

  1. 保存原來的號碼的地方(如果要保存它)
  2. 向左旋轉4位(ROL指令 - 位向左移動,並繞到背部右一)
  3. 保存旋轉值
  4. 掩模用低4位(與$ F)
  5. 檢查結果對你的測試值
  6. 去做的東西,如果他們匹配
  7. 檢索上次旋轉值
  8. 重複2-7三次(捕捉字中的其餘3個半字節)

讓我們假設你要檢查的數值(1234H)是寄存器AX,並且您的測試值在DX中。然後一個可能的程序可能看起來像:

push ax  ; save the original value 
    mov cx,4  ; set main loop count (how many nibbles we want to check) 
mainloop: 
    rol ax,4  ; rotate left 4 bits [puts the top 4 bits into the low 4 bits] 
    mov bx,ax  ; save the rotated value 
    and ax,000Fh ; mask off bottom 4 bits 
    cmp ax,dx  ; check against our test value 
    je  found  ; jump if we found it 
    mov ax,bx  ; retrieve the last rotated value for the next nibble check 
    loop mainloop ; decrement CX and loop if not zero  

    ... do some things here for "not found" case 
    jmp done 
found: 
    ... do some things here for "found" case 

done: 

就是這樣的。您需要指定許多條件,例如是否保留原始值,如果找到匹配而不是找到匹配項,會發生什麼情況,以及您是要匹配所有匹配項還是隻匹配一個匹配項。以上只是告訴你至少有一場比賽。它還顯示瞭如何使用位操作來隔離4位的值。

相關問題