Реализовать деление четверного слова на двойное слово - Assembler
Формулировка задачи:
Здравствуйте.
Помогите-подскажите
Есть задание:
Я вроде бы написал решение для исходных данных в байт, но работает - не верно. Подскажите, как исправить и как реализовать деление четверного слова на двойное слово? (х8086)
Заранее спасибо за помощь
Посчитать выражение для x,y - байт и слово: z=x/(12*y-6)+6
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
Объяснение кода листинга программы
В этом коде реализовано деление двойного слова на двойное слово, а затем результат используется для деления четверного слова на двойное слово. Список элементов кода:
- Переменные:
- x1, y1, x2, y2, p, t, res1, res2 (для хранения значений)
- al, bl, bx, ax, bp, di, si (для временного хранения значений)
- offset y1, x1, y2, x2 (для указания на байты переменных в сегменте данных)
- Вычисления:
- y*12 (используется для обоих операций деления)
- y*12-6 (используется для операций деления и вычисления окончательного результата)
- x/(y*12-6) (основная операция деления)
- x/(y*12-6)+6 (добавление 6 к результату деления)
- Операции сегментации:
- mov ax,data (переход в сегмент данных)
- mov ds,ax (установка сегмента данных)
- mov ax,offset y1/x1/y2/x2 (указание на байты переменных в сегменте данных)
- Операции с плавающей точкой:
- cwd (переход в формат с плавающей точкой)
- div bx/cx (операция деления)
- rcr bp/di/ax/si/res1/res2 (вычисление остатка от деления)
- jc/jnc/jnz/jz (условные переходы для проверки переполнения)
- Вывод результата:
- mov ah,4Ch (установка регистра состояния для функции 4Ch - вывод строки)
- int 21h (выполнение функции 4Ch - вывод строки)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д