Реализовать деление четверного слова на двойное слово - Assembler

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

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

Здравствуйте. Помогите-подскажите Есть задание:
Посчитать выражение для x,y - байт и слово: z=x/(12*y-6)+6
Я вроде бы написал решение для исходных данных в байт, но работает - не верно. Подскажите, как исправить и как реализовать деление четверного слова на двойное слово? (х8086) Заранее спасибо за помощь
data segment
    x db 11,13
    y dw 1311,1113
    p db 12,6 
    res1 dd ?
    res2 dd 2 dup(?)
data ends
code segment
assume ds:data, cs:code
main:
    mov ax,data
    mov ds,ax
    xor ax,ax
    
    ;Byte: y*12
    mov ax,offset x
    mov si,ax
    mov al,1[si]
    mov bx,offset p
    mov di,bx
    mov bl,[di]
    mul bl
    ;y*12-6  
    mov dx,ax
    mov al,1[di]
    cbw
    sub dx,ax  
    ;x/(y*12-6) Double word/word
    mov bx,dx
    mov al,[si]
    cbw
    cwd
    div bx
    ;x/(y*12-6)+6
    mov bx,1[di]
    cbw
    add ax,bx 
    mov z,ax
    mov z+2,dx
    
    ;Word: y*12
    mov ax,offset x
    mov si,ax
    mov al,1[si]
    cbw
    mov bx,offset p
    mov di,bx
    mov bl,[di]
    cbw
    mul bx 
    ;y*12-6  
    mov bl,1[di]
    cbw
    sub dx,bx
    ;x/(y*12-6) Quad word/double word

    mov ah,4Ch
    int 21h
code ends
end main
Так, я тут подправил для байт. Вроде работает. Может кто поможет со словами? Буду благодарен.
data segment
    x db 12,1
    y dw 1311,1113
    p db 12,6 
    res1 dd ?
    res2 dd 2 dup(?)
data ends
code segment
    assume ds:data, cs:code
main:
    mov ax,data
    mov ds,ax
    xor ax,ax
    
    ;Byte: y*12
    mov si,offset x
    mov al,[si+1]   ;y    
    mov di,offset p
    mov bl,[di]      ;12
    mul bl
    ;y*12-6  
    mov dx,ax
    mov al,[di+1]   ;6
    cbw
    sub dx,ax       ;y*12-6 in dx
    ;x/(y*12-6) Double word/word
    mov bx,dx
    mov al,[si]   ; x
    cbw
    cwd
    div bx          ;x/(y*12-6) in ax
    ;x/(y*12-6)+6
    mov bl,[di+1]
    cbw
    add ax,bx 
    mov word ptr res1,ax
    mov word ptr res1+2,dx
       
    ;Word: y*12 
    xor ax, ax
    mov si,offset y
    mov bx, [si+1] ;y
    mov al, [di]   ;12  
    cbw
    mul bx ;y*12 in dx_ax
    ;y*12-6 
    mov bx, ax  ;y*12 in dx_bx
    mov al,[di+1]
    cbw
    sub bx, ax 
    sbb dx, 0     ;y*12 - 6 in dx_bx
    ;x/(y*12-6) Quad word/double word

    mov ah,4Ch
    int 21h
code ends
end main

Решение задачи: «Реализовать деление четверного слова на двойное слово»

textual
Листинг программы
;z=x/(12*y-6)+6
data segment
    x1 db 12
    y1 db 1
    x2 dw 1000
    y2 dw 2000
    p db 12,6
    t dd 6
    res1 dd ?
    res2 dd ?
data ends
 
code segment
    assume ds:data, cs:code
main:
    mov ax,data
    mov ds,ax
    xor ax,ax
    
    ;Byte:
    ;y*12
        mov al,offset y1  ;y     
        mov di,offset p
        mov bl,[di]     ;12
        mul bl
    ;y*12-6  
        mov dx,ax
        mov al,[di+1]   ;6
        cbw
        sub dx,ax       ;y*12-6 in dx
    ;x/(y*12-6) Double word/word
        mov bx,dx
        mov al,offset x1;x
        cbw
        cwd
        div bx          ;x/(y*12-6) in ax
    ;x/(y*12-6)+6
        mov bl,[di+1]
        cbw
        add ax,bx 
        mov word ptr res1,ax
        mov word ptr res1+2,dx
       
    ;Word: 
    ;y*12 
        xor ax,ax
        mov bx,offset y2  ;y
        mov al,[di]    ;12  
        cbw
        mul bx          ;y*12 in dx_ax
    ;y*12-6 
        mov bx, ax      ;y*12 in dx_bx
        mov al,[di+1]
        cbw
        sub bx, ax
        sbb dx, 0       ;y*12 - 6 in dx_bx
    ;x/(y*12-6) Quad word/double word
        mov cx,dx 
        mov ax,offset x2
        cwd
        xchg dx,ax
        mov si,ax
        mov di,0
        mov bp,0
        mov al,33
        clc 
        @: 
        jc @@ 
        cmp cx,bp 
        jb @@ 
        ja @@@ 
        cmp bx,di 
        ja @@@ 
        @@: sub di,bx 
            sbb bp,cx 
            stc 
        @@@: rcl dx,1 
             rcl si,1 
             rcl di,1 
             rcl bp,1 
             dec al 
             jnz @ 
             rcr bp,1 
             rcr di,1 
             jc Overflow
             ;Частное в SI:DX 
             ;Остаток в BP:DI 
        Overflow:
    ;x/(y*12-6)+6
        mov ax,dx
        add ax,word ptr t
        mov res2,ax
        mov ax,si
        add ax,word ptr t+2  
        mov res2+2,ax
               
    mov ah,4Ch
    int 21h
code ends
end main

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

В этом коде реализовано деление двойного слова на двойное слово, а затем результат используется для деления четверного слова на двойное слово. Список элементов кода:

  1. Переменные:
    • x1, y1, x2, y2, p, t, res1, res2 (для хранения значений)
    • al, bl, bx, ax, bp, di, si (для временного хранения значений)
    • offset y1, x1, y2, x2 (для указания на байты переменных в сегменте данных)
  2. Вычисления:
    • y*12 (используется для обоих операций деления)
    • y*12-6 (используется для операций деления и вычисления окончательного результата)
    • x/(y*12-6) (основная операция деления)
    • x/(y*12-6)+6 (добавление 6 к результату деления)
  3. Операции сегментации:
    • mov ax,data (переход в сегмент данных)
    • mov ds,ax (установка сегмента данных)
    • mov ax,offset y1/x1/y2/x2 (указание на байты переменных в сегменте данных)
  4. Операции с плавающей точкой:
    • cwd (переход в формат с плавающей точкой)
    • div bx/cx (операция деления)
    • rcr bp/di/ax/si/res1/res2 (вычисление остатка от деления)
    • jc/jnc/jnz/jz (условные переходы для проверки переполнения)
  5. Вывод результата:
    • mov ah,4Ch (установка регистра состояния для функции 4Ch - вывод строки)
    • int 21h (выполнение функции 4Ch - вывод строки)

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


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

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

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