Как написать функцию деления, которая выдает 0, если делитель равен 0? - PullRequest
0 голосов
/ 27 января 2019

Если он пытается разделить на 0, результат функции должен быть 0.

  org 100h
  mov al,b
  mov bl,c
  mov cl,0
  cmp bl,cl
  jmp posht;
  div bl
  mov ah,d
  mul ah
  mov ah,a
  sub ah,al
posht:
  mov al,0
  ret

a dw 10
b dw 8
c dw 4
d dw 2
zero dw 0

Как я могу заставить этот код работать на ассемблере emu8086?

1 Ответ

0 голосов
/ 31 января 2019
mov bl,c
mov cl,0
cmp bl,cl
jmp posht

Чтобы на самом деле выручить, если делитель окажется равным 0, вам нужно изменить это безусловное jmp на условное: je (скачок, если равен).

Прежде чем вы сможете выполнить (теперь разрешенное) деление, вам все равно нужно очистить регистр AH, поскольку инструкция div bl разделит все AX, а не только AL.

Вам нужно переосмыслить, как ваша функция сообщает о своем результате.На данный момент, независимо от того, равен делителю ноль или нет, AL всегда будет сообщать, что он равен 0. Как вы будете различать?

  mov ax, b    ; 8 Also defines AH
  mov bl, c    ; 4
  cmp bl, 0
  je  posht    ; Bail out on zero divisor
  div bl       ; 8 / 4 --> AL=2 AH=0
  mov ah, d    ; 2
  mul ah       ; 2 * 2 --> AX=4
  mov ah, a    ; 10
  sub ah, al   ; 10 - 4 --> AH=6
  ...          ; ?
  RET
posht:
  mov al, 0
  ret
...