Вывести на экран целое число - Assembler
Формулировка задачи:
Собственно вот программа которая должна вывести на консоль число -23567, но в итоге она ничего не выводит, а Turbo Debugger показывает какую то ахинею
Или что то не так в коде?
п.с. использую TASM 2.5
dseg segment para public 'data' num dw -23567 dseg ends stseg segment stack 'stack' db 64 dup("stack") stseg ends code segment para public 'code' assume ds:dseg, ss:stseg, cs:code digit proc far mov bx, num or bx, bx jns m1 mov al, '-' int 29h neg bx m1: mov ax, bx xor cx, cx mov bx, 10 m2: xor dx, dx div bx add dl, '0' push dx inc cx test ax, ax jnz m2 m3: pop ax int 29h loop m3 ret digit endp code ends end digit
Решение задачи: «Вывести на экран целое число»
textual
Листинг программы
.model tiny .code org 100h main proc mov si,offset num mov di,offset rez mov byte ptr [di],'-' mov word ptr ax,[si] neg ax mov cx,10 call hex_dec mov ah,09h mov dx,offset rez int 21h mov ah,10h int 16h ret hex_dec proc m1: xor dx,dx div cx or ax,ax jz done push dx call m1 pop dx done: add dl,30h mov [di+1],dl inc di ret hex_dec endp num dw -23567 rez db 6 dup (?),'$' main endp end main
Объяснение кода листинга программы
- .model tiny - устанавливает модель памяти для программы (в данном случае, модель tiny)
- .code - указывает на то, что следующий текст является кодом
- org 100h - определяет точку входа в программу (в данном случае, адрес 100h)
- main proc - определяет процедуру main, в которой будет выполняться основная логика программы
- mov si,offset num - перемещает регистр si на адрес переменной num, чтобы получить доступ к ее значению
- mov di,offset rez - перемещает регистр di на адрес переменной rez, чтобы получить доступ к ее значению
- mov byte ptr [di],'-' - записывает символ '-' в байтовый массив rez
- mov word ptr ax,[si] - перемещает слово из переменной num в регистр ax
- neg ax - инвертирует значение регистра ax
- mov cx,10 - устанавливает значение регистра cx равным 10
- call hex_dec - вызывает процедуру hex_dec
- mov ah,09h - устанавливает значение регистра ah равным 9
- mov dx,offset rez - перемещает регистр dx на адрес переменной rez, чтобы получить доступ к ее значению
- int 21h - выполняет интерполяцию 21h, используя значения регистров ax и dx
- mov ah,10h - устанавливает значение регистра ah равным 10
- int 16h - выполняет интерполяцию 16h, используя значения регистров ax и dx
- ret - завершает выполнение процедуры main и возвращает управление операционной системе
- hex_dec proc - определяет процедуру hex_dec
- m1: - определяет внутреннюю процедуру m1 внутри hex_dec
- xor dx,dx - устанавливает регистр dx равным 0
- div cx - делит значение регистра cx на значение регистра dx
- or ax,ax - логически умножает значение регистра ax на себя
- jz done - если результат равен нулю, то переходит к процедуре done
- push dx - сохраняет значение регистра dx в стеке
- call m1 - вызывает процедуру m1
- pop dx - восстанавливает значение регистра dx из стека
- done: - определяет процедуру done внутри hex_dec
- add dl,30h - добавляет значение 30h к значению регистра dl
- mov [di+1],dl - записывает значение регистра dl в байтовый массив rez с смещением 1
- inc di - увеличивает значение регистра di на 1
- ret - завершает выполнение процедуры hex_dec и возвращает управление операционной системе
- num dw -23567 - определяет переменную num со значением -23567
- rez db 6 dup (?),'$' - определяет переменную rez как байтовый массив с шестью повторяющимися символами '?' и значением '$'
- main endp - завершает определение процедуры main
- end main - завершает программу
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д