我正在开发一个程序,以将用户输入作为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
答案 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
计算机就像杂草丛生的计算器,因此在漫不经心地编写大量行之前,请尝试检查是否有一些想要获得结果的通用公式,以及实际上是否可以对其进行一些计算。