Программа с приглашением для ввода числового вектора V. Не пойму что не так (NASM) - Assembler

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

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

Задание:Написать программу с приглашением для ввода числового вектора V после чего произвести ввод еще одного числа X отдельно. Ввод чисел должен осуществляться с клавиатуры. Над каждым элементом вектора и числом X провести операцию вычитания и вывести измененный вектор V на экран. Приглашение зеленым цветом, при вводе числа отображаются красным цветом, вывод результирующего вектора белым цветом.
org 0x100
  
start:  
mov di,0
mov si,0
go:
    ; ввод символа
    mov     ah, 0; читать (ожидать) следующую нажатую клавишу
    int     0x16
   ; эхо символа
    cmp     al, 27
    je      exit
    mov     ah, 09h 
    mov     bx, 0004h ; цвет
    mov     cx, 1
    int     10h
    mov     ah, 0Eh
    int     10h
 exit:
ret
m2:
cmp di,4
jnz m1
jz  m3
jmp     go
 
ret

string dw 0,0,0,0
array dw 0,0,0,0 
x dw 0

m1:
mov [string+di],al
add si,2
inc di
call go
m3:
mov [x],al

m4:
mov si, 0
mov di,0
cmp di,4
jz m5
mov ax,[string+di]
sub ax,[x]
mov [array+di],ax
inc bx
add si,2
call m4

m5:
mov cx,8
mov si,array
mov ah,02h
m6:
mov dl,[si]
int 21h
inc si
loop m6
ret
Вызываю prog.com вводит 3 числа , а дальше зависает , вызываю afdpro.exe prog.com прерывание int 0x16 делается , а числа не дает вводить просто выполняет левые команды . Приглашение еще не добавил , так как прога не робит

Решение задачи: «Программа с приглашением для ввода числового вектора V. Не пойму что не так (NASM)»

textual
Листинг программы
    Model   Tiny
    .Code
    Org 100h
Start:
    mov dx, offset Text
    mov ah, 9
    int 21h
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Ввод десятичного числа без знака 0..65535
    xor bx, bx      ;Будет введенным числом
    xor cx, cx      ;Счетчик введенных цифр
@:  mov ah, 0       ;Ввод символа с клавиатуры
    int 16h     ; с ожиданием без эха
    cmp al, 0       ;Если непечатный символ
    je  @       ; то игнорируем
    cmp al, 0Dh     ;Возврат каретки ?
    je  CR
    cmp al, 8       ;Забой ?
    je  BS
    cmp al, '0'     ;Ниже цифр ?
    jb  @       ;Если да, игнорируем
    cmp al, '9'     ;Выше цифр ?
    ja  @       ;Если да, игнорируем
    push    ax
    mov ax, 10
    mul bx      ;Старое число умножим на 10
    mov bp, ax
    pop ax
    test    dx, dx      ;Переполнение ?
    jnz @       ;Если да, игнорируем цифру
    mov dl, al
    sub dl, '0'     ;Из ASCII-кода цифры ее значение
    add bp, dx      ;К старому_числу*10 прибавим введенную цифру
    jc  @       ;Если переполнение, игнорируем цифру
    mov bx, bp      ;Успешно получили новое значение числа
    call    PutC        ;Теперь выведем введенную цифру
    inc cx      ;На одну цифру больше
    jmp @       ;Ввод следующего символа
 
BS: jcxz    @       ;Если 0 цифр введено, забой игнорируем
    call    PutC        ;Вывод забоя
    mov al, ' '
    call    PutC        ;Вывод пробела
    mov al, 8
    call    PutC        ;Вывод забоя
    mov ax, bx
    xor dx, dx
    mov bx, 10
    div bx      ;Старое число поделим на 10
    mov bx, ax      ;И получим число до введения последней цифры
    dec cx      ;На одну цифру меньше
    jmp @       ;Ввод следующего символа
 
PutC:   mov ah, 0Eh     ;Вывод символа в AL
    int 10h     ; в режиме телетайпа
    ret
 
CR: call    PutC        ;Вывод возврата каретки
    mov al, 0Ah     ;Перевод строки
    call    PutC        ;Вывод перевода строки
    ;Здесь в BX введенное число
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
;   ...
 
    int 20h
 
Text    db  'Enter number: $'
 
    End Start

Объяснение кода листинга программы

  1. Ввод десятичного числа без знака 0..65535
  2. xor bx, bx - Будет введенным числом
  3. xor cx, cx - Счетчик введенных цифр
  4. mov ah, 0 - Ввод символа с клавиатуры
  5. int 16h - с ожиданием без эха
  6. cmp al, 0 - Если непечатный символ
  7. je @ - то игнорируем
  8. cmp al, 0Dh - Возврат каретки ?
  9. je CR - Если да, игнорируем
  10. cmp al, 8 - Забой ?
  11. je BS - Если да, игнорируем
  12. cmp al, '0' - Ниже цифр ?
  13. jb @ - Если да, игнорируем
  14. cmp al, '9' - Выше цифр ?
  15. ja @ - Если да, игнорируем
  16. push ax
  17. mov ax, 10
  18. mul bx - Старое число умножим на 10
  19. mov bp, ax
  20. pop ax
  21. test dx, dx - Переполнение ?
  22. jnz @ - Если да, игнорируем цифру
  23. mov dl, al - Из ASCII-кода цифры ее значение
  24. add bp, dx - К старому_числу*10 прибавим введенную цифру
  25. jc @ - Если переполнение, игнорируем цифру
  26. mov bx, bp - Успешно получили новое значение числа
  27. call PutC - Теперь выведем введенную цифру
  28. inc cx - На одну цифру больше
  29. jmp @ - Ввод следующего символа
  30. BS: jcxz @ - Если 0 цифр введено, забой игнорируем
  31. call PutC - Вывод забоя
  32. mov al, ' ' - Вывод пробела
  33. call PutC - Вывод забоя
  34. mov al, 8 - Вывод забоя
  35. call PutC - Вывод забоя
  36. mov ax, bx - И получим число до введения последней цифры
  37. dec cx - На одну цифру меньше
  38. jmp @ - Ввод следующего символа
  39. PutC: mov ah, 0Eh - Вывод символа в AL
  40. int 10h - в режиме телетайпа
  41. ret
  42. CR: call PutC - Вывод возврата каретки
  43. mov al, 0Ah - Перевод строки
  44. call PutC - Вывод перевода строки
  45. ;Здесь в BX введенное число
  46. int 20h
  47. Text db 'Enter number: $'
  48. End Start

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

7   голосов , оценка 3.429 из 5
Похожие ответы