Программа с приглашением для ввода числового вектора V. Не пойму что не так (NASM) - Assembler
Формулировка задачи:
Задание:Написать программу с приглашением для ввода числового вектора V после чего произвести ввод еще одного числа X отдельно. Ввод чисел должен осуществляться с клавиатуры. Над каждым элементом вектора и числом X провести операцию вычитания и вывести измененный вектор V на экран. Приглашение зеленым цветом, при вводе числа отображаются красным цветом, вывод результирующего вектора белым цветом.
Вызываю prog.com вводит 3 числа , а дальше зависает , вызываю afdpro.exe prog.com прерывание int 0x16 делается , а числа не дает вводить просто выполняет левые команды .
Приглашение еще не добавил , так как прога не робит
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
Решение задачи: «Программа с приглашением для ввода числового вектора 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
Объяснение кода листинга программы
- Ввод десятичного числа без знака 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 - Из 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 - И получим число до введения последней цифры
- 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д