[英]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.