从十六进制表达式中获取单个字符?

时间:2013-06-28 23:06:47

标签: assembly x86-16

我有一个十六进制值存储在这样的寄存器中:

mov ax,1234h

我需要将每个字符(1,2,3,4)与十进制值进行比较,理想情况下我会遍历寄存器中的字符/数字,但我不知道如何指向每个字符/数字,或者它是否是甚至可能。怎么办呢?

2 个答案:

答案 0 :(得分:1)

这是汇编语言,因此没有一条指令可以完成此操作。有几个步骤。可能最有效的方式将描述如下。第一步是在需要时保存值,因为其余代码会破坏它。这些步骤有点不精确,但给出了一般算法:

  1. 将原始号码保存在某处(如果要保存)
  2. 向左旋转4位(ROL指令 - 向左移动位并从右侧向后回绕)
  3. 保存旋转值
  4. 屏蔽低4位(AND与$ F)
  5. 根据您的测试值检查结果
  6. 如果匹配则执行某些操作
  7. 检索上次轮换的值
  8. 重复2-7三次(以捕获单词中剩余的3个半字节)
  9. 假设您要检查的值(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位片段。

答案 1 :(得分:0)

给出1234h这样的数字除以16,得到余数,这是你的第一个最大数字

如果除法的结果不为零,则重复使用除法结果作为您的数字。

这是众所周知的基本转换算法。你可以在维基百科上查找。 http://en.wikipedia.org/wiki/Hexadecimal