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

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

Выполняемые действия в коде:

  1. Переменная «ax» получает значение из памяти по адресу «mas[0]».
  2. Переменная «cx» инициализируется значением 10.
  3. Начало цикла:
  4. Переменная «dx» инициализируется значением 0.
  5. Деление переменной «ax» на значение переменной «bx» с сохранением остатка в переменной «dx».
  6. Сохранение значения переменной «dx» в стеке.
  7. Увеличение значения переменной «cx» на единицу.
  8. Проверка значения переменной «ax» на неравенство нулю.
  9. Если условие в пункте 8 выполняется, то происходит переход к следующей итерации цикла.
  10. Значение переменной «ah» устанавливается равным 02h.
  11. Возврат из стека значения переменной «dx».
  12. Сравнение значения переменной «dl» с 9.
  13. Если условие в пункте 12 выполняется, то происходит переход к следующей итерации цикла.
  14. Увеличение значения переменной «dl» на 7.
  15. Добавление к значению переменной «dl» символа, соответствующего его десятичному значению.
  16. Вывод на экран символа с помощью команды «int 21h».
  17. Повторение цикла с пункта 10 до тех пор, пока не будет выполнено условие выхода из цикла.
  18. Значение переменной «al» инициализируется значением 0.
  19. Значение переменной «ah» устанавливается равным 01h.
  20. Вывод на экран символа с помощью команды «int 21h».

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


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

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

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