2013-06-28 3 views
0

У меня есть шестнадцатеричное значение, сохраненное в регистре, такие как этот:Получить один символ из выражения hex?

mov ax,1234h 

мне нужно сравнивать каждый символ (1,2,3,4) с десятичным значением, в идеале я бы через петлю персонажей/numbers в реестре, но я не знаю, как указать на каждый, или если это возможно. Как это может быть сделано?

ответ

0

Дано число таких как 1234h разделить его на 16 лет, получить остаток, это ваш первый RIGH-наибольшее количество

если результат деления не равен нулю, то повторить, используя результат деления как ваш номер.

Это известный алгоритм преобразования базы данных. вы можете посмотреть его на википедию. http://en.wikipedia.org/wiki/Hexadecimal

1

Это язык ассемблера, поэтому для этой операции нет одной инструкции. Есть несколько шагов. Вероятно, наиболее эффективный способ времени будет описан следующим образом. Первый шаг - сохранить значение, если вам нужно, так как остальная часть кода уничтожит его. Эти шаги являются немного неточным, но дать общий алгоритм:

  1. Сохранить оригинальный номер где-то (если вы хотите сохранить его)
  2. Повернуть влево 4 бита (инструкция ROL - биты перемещаются влево и заверните назад вокруг справа)
  3. Сохранить вращаемого значение
  4. маска низких 4 бита (и с $ F)
  5. Проверьте результат с тестовым значением
  6. Go сделать что-то, если они соответствуют
  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-битные фрагменты значения с помощью бит-операций.

Смежные вопросы