assembly 在汇编x86 MASM中将十六进制字符串转换为二进制

tnkciper  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(126)

例如,我有:n1 db "1234",表示十六进制值。我想将其转换为二进制并存储在32位寄存器中,在这种情况下,结果将是:EAX = 0000 0000 0000 0000 0001 0010 0011 0100
方法是什么?

6bc51xsx

6bc51xsx1#

Inputting multi-radix multi-digit signed numbers with DOS在答案的代码片段 2a2b 中显示了如何进行这种特殊的转换。您还可以学习如何从八进制转换为二进制。
不要被“DOS”这个词所误导。许多原则都是一样的,如果你目前还不知道,这将是一个很好的起点。你可以根据你的需要和技能水平来修改代码。如果这不起作用,那么你可以提出一个问题,包括你已经尝试过的代码。
下面是对上述片段的改编:
代码片段 2a

; Hexadecimal
.a: inc   esi             ; Next character
    shl   eax, 4          ; Result = Result * 16
    movzx edx, byte [esi] ; -> DL = {["0","9"],["A","F"]} (NewDigit)
    cmp   dl, "9"
    jbe   .b
    sub   edx, 7
.b: sub   edx, 48
    or    eax, edx        ; Result = Result + NewDigit
    dec   ecx
    jnz   .a

具有字符验证和溢出检测的snippet 2b

; Hexadecimal
.a: inc   esi             ; Next character
    movzx edx, byte [esi] ; -> DL = {["0","9"],["A","F"]} (NewDigit) ?
    cmp   dl, "9"
    jbe   .b
    sub   edx, 7
.b: sub   edx, 48
    cmp   dl, 15
    ja    .z              ; Stop if not a digit
    rol   eax, 4          ; Result = Result * 16
    test  al, 15
    jnz   .o              ; Overflow
    or    eax, edx        ; Result = Result + NewDigit
    dec   ecx
    jnz   .a

相关问题