нужно написать код на языке ассемблера, это правильно - PullRequest
0 голосов
/ 10 июля 2020

Нужен код на ассемблере для решения уравнения z=(x+3)/2 известно, что x = 7

Я пробовал использовать div, но кто-то сказал, что лучше использовать sub и цикл, и мне нужно показать Десятичные дроби

.model small
.stack 100h
.data

x db 6
z db ?
.code
main proc
mov ax,data
mov ds,ax
mov ah,0
mov bl,2
mov al,x
add al,3
div bl
mov z,al
add z,48
mov dl,z
mov ah,2h
int 21h 



main endp
end main

1 Ответ

0 голосов
/ 12 июля 2020

Это правильно?

Нет, потому что в вопросе указано, что x=7 и ваша программа определяет x db 6.

... и Мне нужно показать десятичные дроби

Если x=7, тогда выражение (x+3)/2 не даст дроби (результат будет 5).

Однако, если мы сделаем упражнение немного интереснее, мы могли бы предусмотреть ряд входных данных для x в уравнении. Тогда единственная дробь, которую вы можете получить от деления на 2, будет .5 .

x=7 и используя деление на 2

.data
  x db 7
  z db ?
.code
main proc
  mov ax, data
  mov ds, ax
  mov al, x
  add al, 3
  cbw
  mov bl, 2
  div bl        ; -> AL == 5
  mov z, al
  add al, '0'
  mov dl, al    ; -> DL == "5"
  mov ah, 02h   ; DOS.PrintChar
  int 21h

x=6 и замена деления на 2 сдвигом вправо

.data
  x db 6
.code
main proc
  ...
  mov al, x
  add al, 3
  shr al, 1
  mov dx, '00'
  jnc Divisible
  mov dh, '5'
Divisible:
  add dl, al    ; -> DL == "4"
  mov ah, 02h   ; DOS.PrintChar
  int 21h
  mov dl, '.'   ; Decimal point
  int 21h
  mov dl, dh    ; -> DL == "5"
  int 21h

Здесь сдвиг вправо приведет к переносу, потому что (x+3) - нечетное число. Поэтому в результате будет отображаться .5 , иначе будет отображаться .0 .

Вы можете запустить приведенный выше пример с x в диапазоне от 0 до 16. Результаты будут варьироваться от 1,5 до 9,5.

...