[emu8086] Вывод числа из (DX:AX) на экран - Assembler

Узнай цену своей работы

Формулировка задачи:

Дана функция Y=(3x^3-120)^2 +9x, область допустимых значений строго от 0 до 7, при вводе чисел от 0 до 4, ответ выводит с помощью одного регистра AX, а от 5 до 7- старшие разряды идут в регистр DX. Как сделать вывод числа DX:AX на экран? Вот код моей программы:
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.
P.S. Умножение делал через сдвиги, в степень возводил через умножение

Решение задачи: «[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

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

  1. Описание работы программы:
    • Программа выводит на экран 32-битное беззнаковое число.
    • Входные данные: DX:AX содержит число.
    • Программа сначала сохраняет число во временной переменной, затем вычисляет каждую цифру числа, преобразуя ее в символ и выводя на экран.
    • После вывода всех цифр программа завершается.
  2. Описание процедуры ShowUInt32:
    • Использует регистры: AX, BX, CX, DX, SI, DI.
    • Локальная переменная: temp[], используется для хранения числа и его цифр.
    • Процедура сначала сохраняет число во временной переменной.
    • Затем она делит число на 10, используя делитель 10, и повторяет этот процесс до тех пор, пока все цифры числа не будут выведены.
    • После вывода всех цифр процедура завершается.
  3. Описание основной программы:
    • Использует регистры: AX, BX, CX, DX, SI, DI.
    • Локальная переменная: ui32[], содержит число 1234567890.
    • Программа вызывает процедуру ShowUInt32, передавая ей DX:AX, содержащие число 4136h.
    • Затем программа завершается.

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


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

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

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