Вывод ascii и scan кодов - Assembler

Узнай цену своей работы

Формулировка задачи:

Всем привет. Надо занести в буфер клавиатуры вместо цифр их скан коды, а вместо букв их ascii код. Проблемы с проверкой. И с самим преобразованием в нужные коды .
new_9int proc far
  push ax
  push bx
  push di
  push es
  sti
  
  call cs:[old_9int]
  mov ax,40h ; устанавливаем регистр es на область данных BIOS
  mov es,ax

  mov di,es:[01Ch] ; получаем указатель на голову
  cmp di,01Eh ; он указывает на начало буфера?
  jne minus2 ; если нет, то надо отнять 2 от хвоста
  mov di,03Ch 
  jmp el ; если да, то указатель переместим на начало 
  minus2: sub di,2 
 
  el:mov ax,ex:[di] ; считаем скан код из буфера клавиатуры
  cmp al,61h ; проверка, что буквы от z до a 
; тут я вроде бы правильно проверяю. 
  jz do ; если нет, то на do
  add al,30h ; прибавим 
; преобразование
  
; не могу реализовать с цифрами
 
  do: cmp 
  mov es:[di],ax ; запись в буфер

 do:   cli
    mov al,20h ; пошлем EOI в контроллер прерываний    
    out 20h,al
    pop es
    pop di
    pop bx
    pop ax
    iret
new_9int endp

Решение задачи: «Вывод ascii и scan кодов»

textual
Листинг программы
ORG 100h
JMP start
 
mess0   DB  13,10,'ENTER STRING:  $'
 
start:                   ;
   MOV   AH,9            ;
   MOV   DX,mess0        ;
   INT   21h             ;
 
@input:                  ;
   XOR   AX,AX           ; ждём клавишу..
   INT   16h             ;
   CMP   AL,13           ; ENTER указывает на выход!
   JE    exit            ;
   CMP   AL,30h          ; фильтр чисел
   JB    @symbol         ; меньше - буква
   CMP   AL,39h          ;
   JA   @symbol          ; больше - буква
   SHR   AX,8            ; у цифры - сдвигаем скан-в-аскии (AH -> AL)
   CALL  HEX2ASC         ; выводим на экран в виде цифры
   MOV   AL,','          ; запятая/разделитель
   INT   29h             ;
   JMP   @input          ;
@symbol:                 ; попалась буква!
   XOR   AH,AH           ; убираем скан-код..
   CALL  HEX2ASC         ; ..и выводим на экран как цифру
   MOV   AL,','          ;
   INT   29h             ;
   JMP   @input          ;
 
exit:                    ;
   INT   20h             ; выход для COM-файла!
 
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
HEX2ASC:                 ; Функция переводит числа в символы
   PUSHA                 ; Вход:  АХ = число, BX = система счисления
   XOR   CX,CX           ; Выход: на экране
   MOV   BX,16           ;
isDiv:                   ;
   XOR   DX,DX           ;
   DIV   BX              ;
   PUSH  DX              ;
   INC   CX              ;
   OR    AX,AX           ;
   JNZ   isDiv           ;
isOut:                   ;
   POP   AX              ;
   CMP   AL,9            ;
   JLE   noHex           ;
   ADD   AL,7            ;
noHex:                   ;
   ADD   AL,30h          ;
   INT   29h             ;
   LOOP  isOut           ;
   POPA                  ;
RET                      ;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.3 из 5