[emu8086] Вывод числа из (DX:AX) на экран - Assembler
Формулировка задачи:
Дана функция Y=(3x^3-120)^2 +9x, область допустимых значений строго от 0 до 7, при вводе чисел от 0 до 4, ответ выводит с помощью одного регистра AX, а от 5 до 7- старшие разряды идут в регистр DX. Как сделать вывод числа DX:AX на экран?
Вот код моей программы:
P.S. Умножение делал через сдвиги, в степень возводил через умножение
data segment xper dw ? kper db ? xznach db "Vvedite: x= ",0 min dw 0 max dw 7 konec db "f(x)= ",0 nn db " ne nado pisat' tak",0 ends include 'emu8086.inc' stack segment dw 128 dup(0) ends code segment start: ; set segment registers: mov ax, data mov ds, ax mov es, ax xor cx, cx lea si,xznach call print_string call scan_num cmp cx, min jl z4 cmp cx, max jg z4 xor bx, bx xor dx,dx xor ax, ax mov max, cx mov bx, cx mov ax,bx mov cx ,3 dec Cx a1: mul bx loop a1 mov bx, ax sal ax, 1 add ax, bx sub ax, 120 mov bx, ax mov cx ,2 dec Cx a2: imul bx loop a2 mov bx, max sal bx, 3 add bx, max add ax, bx mov bx, ax gotoxy 0,1 lea sI, KONEC call print_string call print_num jmp short z5 z4: gotoxy 0,1 lea si, nn call print_string z5: mov ax, 4c00h ; exit to operating system. int 21h ends DEFINE_SCAN_NUM DEFINE_PRINT_STRING define_print_num define_print_num_uns end start ; set entry point and stop the assembler. ; wait for any key.... mov ah, 1 int 21h mov ax, 4c00h ; exit to operating system. int 21h ends end start ; set entry point and stop the assembler.
Решение задачи: «[emu8086] Вывод числа из (DX:AX) на экран»
textual
Листинг программы
LOCALS .model small, Pascal .stack 100h .data ui32 dd 1234567890 .code main proc mov ax, @data mov ds, ax mov ax, 4136h mov dx, 0004h call ShowUInt32 mov ax, 4C00h int 21h main endp ;Вывод на экран целого 32 разрядного беззнакового числа ;на входе: ; dx:ax - целое 32 разрядное беззнаковое число ShowUInt32 proc USES ax,bx,cx,dx,si,di LOCAL temp:DWORD ;переменная для сохранения частного от деления на 10 ;сохранить значение числа во временной переменной mov word ptr temp[0], ax mov word ptr temp[2], dx mov bx, 10 ;делитель mov di, 0 ;количество цифр @@NextDigit: mov cx, 2 ;количество операций деления mov si, 2 ;смещение делимого в переменной temp mov dx, 0 ;остаток от предыдущего деления на 10 @@DivBy10: mov ax, word ptr temp[si] div bx mov word ptr temp[si], ax sub si, 2 loop @@DivBy10 ;преобразование остатка от деления temp на 10 в символ цифры add dl, '0' push dx ;сохранение символа цифры в стеке inc di ;счётчик цифр увеличить на 1 mov ax, word ptr temp[0] ;остаток равен 0? or ax, word ptr temp[2] jnz @@NextDigit ;нет - продолжить ;вывод цифр mov cx, di ;количество выводимых символов mov ah, 02h ;функция вывода на экран для int 21h @@ShowDigit: pop dx ;извлечение цифры из стека int 21h ;вывод символа на экран loop @@ShowDigit ret ShowUInt32 endp end main
Объяснение кода листинга программы
- Описание работы программы:
- Программа выводит на экран 32-битное беззнаковое число.
- Входные данные: DX:AX содержит число.
- Программа сначала сохраняет число во временной переменной, затем вычисляет каждую цифру числа, преобразуя ее в символ и выводя на экран.
- После вывода всех цифр программа завершается.
- Описание процедуры ShowUInt32:
- Использует регистры: AX, BX, CX, DX, SI, DI.
- Локальная переменная: temp[], используется для хранения числа и его цифр.
- Процедура сначала сохраняет число во временной переменной.
- Затем она делит число на 10, используя делитель 10, и повторяет этот процесс до тех пор, пока все цифры числа не будут выведены.
- После вывода всех цифр процедура завершается.
- Описание основной программы:
- Использует регистры: AX, BX, CX, DX, SI, DI.
- Локальная переменная: ui32[], содержит число 1234567890.
- Программа вызывает процедуру ShowUInt32, передавая ей DX:AX, содержащие число 4136h.
- Затем программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д