我有一个十六进制值存储在一个寄存器中,比如这个:
mov ax,1234h
我需要将每个字符(1,2,3,4)与一个十进制值进行比较,理想情况下我会遍历寄存器中的字符/数字,但我不知道如何指向每个字符,或者是否有可能。如何才能做到这一点?
这是汇编语言,因此没有一条指令可以完成此操作。有几个步骤。可能最省时的方式将描述如下。第一步是在需要时保存该值,因为其余代码会破坏它。这些步骤有点不精确,但给出了一般算法:
假设您要检查的值 (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 位片段。
给定一个数字,例如 1234h 除以 16,得到余数,这是你的第一个最右边的数字
如果除法的结果不为零,则使用除法的结果作为您的数字重复。
这是众所周知的碱基转换算法。你可以在维基百科上查到。http://en.wikipedia.org/wiki/十六进制