存储两位数字的用户输入

时间:2018-09-21 20:06:05

标签: assembly

我正在开发一个程序,以将用户输入作为hexi值存储在AL中。如果用户输入9,然后输入4,我最终希望将94h存储在AL中。这部分正在工作。现在,如果用户先输入B,然后输入4,我想将B4h存储在AL中。这就是我卡住的地方。我是新来的汇编人员,所以请不要对我太吵-我知道它不漂亮!我遇到的问题是,一旦我在DH中拥有0Bh,在DL中拥有04h,我如何将它们连接起来以获得B4h?

注意:跳转说明还没有完成,我知道我需要完成它们。

ReadHexByte proc
call ReadChar
cmp al, 39h
jbe number
cmp al, 41h
jz letter_a
cmp al, 42h
jz letter_b
cmp al, 43h
jz letter_c
cmp al, 44h
jz letter_d
cmp al, 45h
jz letter_e
cmp al, 46h
jz letter_f

number: mov dh, al
    sub dh, 30h
    shl dh, 4
    call ReadChar
    sub al, 30h
    add al, dh

letter_a: mov dh, 0Ah
     shr dh, 4
     call ReadChar
     sub al, 30h
     add al, dh
letter_b: mov dh, 0Bh
     call ReadChar
     sub al, 30h
letter_c: mov dh, 0Ch
     call ReadChar
     sub al, 30h
     add al, dh
letter_d: mov dh, 0Dh
     call ReadChar
     sub al, 30h
     add al, dh
letter_e: mov dh, 0Eh
     call ReadChar
     sub al, 30h
     add al, dh
letter_f: mov dh, 0Fh
     call ReadChar
     sub al, 30h
     add al, dh

ReadHexByte endp

1 个答案:

答案 0 :(得分:1)

在您的代码中,每个FIRST-INPUT字母都有跳转,您实际上可以将所有这些init硬编码为mov dh,0B0h->问题已解决...

但这太丑陋了,计算一些值怎么样?

就像将第一个输入与'A'进行比较,如果在下面,则跳过下一个补丁;补丁码可以减去7,并将字母A(41h)变成3Ah,依此类推。直到字母F变成3Fh;然后您可以用相同的方式处理字母(拼凑成3A..3F值)和数字(30..39)的值,只需将它们向上移4位= DH就可以了。

赞:

ReadHexByte proc
    ; this routine doesn't handle invalid input and
    ; only uppercase A-F letters are supported!

    ; read first hexa digit (char)
    call ReadChar
    cmp al, 39h
    jbe firstCharWasDigit
    sub al, 'A'-('0'+10)    ; convert letters "A..F" into 3A..3F value
        ; your assembler should assemble that above as "sub al, 7"
        ; if it does not support math expressions, write it with 7
firstCharWasDigit:
    mov dh, al      ; dh = 30h..3Fh depending on valid input (0..9A..F)
    shl dh, 4       ; move low 4 bits into upper 4 bits
        ; there is no need to do sub dh,30h before shift, because shift
        ; will throw away the upper 4 bits anyway

    ; read second hexa digit (char)
    call ReadChar
    sub al, '0'     ; convert ASCII into 0..9 (digits) and 17..22 (A-F)
    cmp al, 9
    jbe secondCharWasDigit
    sub al, 'A'-('0'+10)    ; sub al, 7 to fix letter values to 10..15
secondCharWasDigit:

    ; compose low 4 bits in AL with high 4 bits in DH into AL
    ; (it actually does compose 8 bits with 8 bits, but previous code
    ; does ensure that only low/high 4 bits are set for valid inputs)
    or  al, dh
    ret
ReadHexByte endp

计算机就像杂草丛生的计算器,因此在漫不经心地编写大量行之前,请尝试检查是否有一些想要获得结果的通用公式,以及实际上是否可以对其进行一些计算。