Tasm 02h не выводит символ, записанный в память - Assembler
Формулировка задачи:
Уже все перепробовал, в отладчике все значения правильные, в dl 31h НО выводит 0 всегда.
ввод: 1 2 3
dl никак не выводит символ!
sseg segment stack dw 256 dup(?) sseg ends dseg segment bbuff db 5 mas dw 50 dup(?) text db 50 dup(0) ten db 10 mes3 db 0ah,0dh,'Элемент $' BoolMinus db 0 FirstNum db 1 N db 0 MINUS = 45 SPACE = 20h dseg ends cseg segment assume ss:sseg,ds:dseg,cs:cseg START: mov ax,dseg mov ds,ax ;==================MAIN====================== ;------------ВВОД------------------ lea dx,text ;Первый байт -- макс колличество символов mov text[0],50 mov ah,0Ah ;ввод int 21h call CursorDown ;------------Преобразуем и записуем в массив mas------------------ mov cl,text[1] mov si,2 ix: mov al,text[si] cmp al,MINUS jz mMinus cmp al,SPACE jz mSpace ;----------если число sub al,30h cmp FirstNum,1 jz m1 mul ten ; *10 add bx,ax jmp endloop m1: mov FirstNum,0 mov bl,al jmp endloop ;----------- mMinus: mov BoolMinus,1 jmp endloop mSpace: mov BoolMinus,0 mov FirstNum,1 mov mas[di],bx inc N inc di inc di endloop: inc si loop ix mov mas[di],bx ;=============END MAIN====================== mov dx,mas[0] add dl,30h mov ah,02h int 21h xor ax,ax mov ah, 4Ch int 21h ;void CursorDown(void) CursorDown proc push ax mov ah,02h mov dl,10 int 21h pop ax ret endp CursorDown cseg ends end START
Решение задачи: «Tasm 02h не выводит символ, записанный в память»
textual
Листинг программы
mov ax,mas[0] xor cx,cx mov bx,10 ; основание сс. 10 для десятеричной и т.п. oi2: xor dx,dx div bx push dx inc cx test ax, ax jnz oi2 mov ah, 02h oi3: pop dx cmp dl,9 jbe oi4 add dl,7 oi4: add dl,'0' int 21h loop oi3 xor al,al mov ah,01h int 21h
Объяснение кода листинга программы
Выполняемые действия в коде:
- Переменная «ax» получает значение из памяти по адресу «mas[0]».
- Переменная «cx» инициализируется значением 10.
- Начало цикла:
- Переменная «dx» инициализируется значением 0.
- Деление переменной «ax» на значение переменной «bx» с сохранением остатка в переменной «dx».
- Сохранение значения переменной «dx» в стеке.
- Увеличение значения переменной «cx» на единицу.
- Проверка значения переменной «ax» на неравенство нулю.
- Если условие в пункте 8 выполняется, то происходит переход к следующей итерации цикла.
- Значение переменной «ah» устанавливается равным 02h.
- Возврат из стека значения переменной «dx».
- Сравнение значения переменной «dl» с 9.
- Если условие в пункте 12 выполняется, то происходит переход к следующей итерации цикла.
- Увеличение значения переменной «dl» на 7.
- Добавление к значению переменной «dl» символа, соответствующего его десятичному значению.
- Вывод на экран символа с помощью команды «int 21h».
- Повторение цикла с пункта 10 до тех пор, пока не будет выполнено условие выхода из цикла.
- Значение переменной «al» инициализируется значением 0.
- Значение переменной «ah» устанавливается равным 01h.
- Вывод на экран символа с помощью команды «int 21h».
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д