繁体   English   中英

存储两位数字的用户输入

[英]Storing two digit user input

我正在开发一个程序来将用户输入存储为AL中的hexi值。 如果用户输入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

在每个FIRST-INPUT字母跳转的代码中,您实际上可以将所有这些mov dh,0B0h硬编码为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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM