Хранение двухзначного пользовательского ввода - PullRequest
0 голосов
/ 21 сентября 2018

Я работаю над программой для сохранения пользовательского ввода в виде шестнадцатеричного значения в AL.Если пользователь вводит 9, а затем 4, я хочу в конечном итоге сохранить 94h в AL.Эта часть работает.Теперь, если пользователь вводит сначала B, а затем 4, я хочу сохранить B4h в AL.Вот где я застрял.Я новичок в сборке, так что не бейте меня слишком сильно - я знаю, что это не красиво!Проблема, с которой я сталкиваюсь, состоит в том, что когда у меня будет 0Bh в DH и 04h в DL, как бы я связал их, чтобы получить 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 голосов
/ 22 сентября 2018

В вашем коде с переходом на букву FIRST-INPUT вы фактически можете жестко закодировать все эти элементы как mov dh,0B0h -> проблема решена ...

Но это очень уродливо, как насчет вычисления некоторые значения?

Как сравнивать первый ввод с 'A', и, если он ниже, пропустить следующий патч;патч-код может вычесть 7, и он превратит букву A (41h) в 3Ah и т. д. до буквы F в 3Fh;и затем вы можете одинаково обработать значение как для буквы (вставлено в значения 3A..3F), так и для цифры (30..39), просто сдвинув их на 4 бита вверх = DH готов.

Какthis:

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

Компьютер похож на заросший калькулятор, поэтому, прежде чем бездумно писать тонну строк, попробуйте проверить, есть ли какая-то более общая формула для результатов, которых вы хотите достичь, и можете ли вы на самом деле несколько их вычислить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...