0

我有一个十六进制值存储在一个寄存器中,比如这个:

mov ax,1234h

我需要将每个字符(1,2,3,4)与一个十进制值进行比较,理想情况下我会遍历寄存器中的字符/数字,但我不知道如何指向每个字符,或者是否有可能。如何才能做到这一点?

4

2 回答 2

1

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

  1. 将原始号码保存在某处(如果要保存)
  2. 向左旋转 4 位(ROL 指令 - 位向左移动并从右侧回绕)
  3. 保存旋转值
  4. 屏蔽低 4 位(AND 与 $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 位片段。

于 2013-06-28T23:55:55.497 回答
0

给定一个数字,例如 1234h 除以 16,得到余数,这是你的第一个最右边的数字

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

这是众所周知的碱基转换算法。你可以在维基百科上查到。http://en.wikipedia.org/wiki/十六进制

于 2013-06-28T23:18:00.693 回答