我有一个十六进制值存储在这样的寄存器中:
mov ax,1234h
我需要将每个字符(1,2,3,4)与十进制值进行比较,理想情况下我会遍历寄存器中的字符/数字,但我不知道如何指向每个字符/数字,或者它是否是甚至可能。怎么办呢?
答案 0 :(得分:1)
这是汇编语言,因此没有一条指令可以完成此操作。有几个步骤。可能最有效的方式将描述如下。第一步是在需要时保存值,因为其余代码会破坏它。这些步骤有点不精确,但给出了一般算法:
假设您要检查的值(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