17 / 17 / 1
Регистрация: 13.11.2012
Сообщений: 154
1

Как правильно разделить два числа

09.12.2012, 02:56. Показов 14782. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите пожалуйста, как правильно разделить два числа на ассемблере(TASM)! Возник спор с преподавателем! У меня есть два числа, оба размером в слово, для того что бы выполнить операцию деления расширяю делимое до размера двойного слова и выполняю ее. По идее ответ получается размером в слово. Мне же говорят, что это не правильно. Подскажите как можно реализовать такую операцию? По другому не знаю...
Для примера покажу код программы, с которой и возникли проблемы...
Есть выражение: f=(d*c-1)/(a*c-10)+...; a, c, d - размером в байт
Assembler
1
2
3
4
5
6
7
8
9
10
mov AL,a
       mul c
       sub AX,10
       mov BX,AX
       mov AL,d
       mul c
       dec AX
       cwd
       div BX
       mov BX,AX    ;BX - (d*c-1)/(a*c-10)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2012, 02:56
Ответы с готовыми решениями:

[NASM] Разделить два действительных числа
Нужно написать программу, делящую 2 действительных числа. Числа могут быть положительные,...

Разделить с выводом остатка два произвольных десятичных положительных целых числа
Напишите программу, позволяющую делить с выводом остатка два произвольных десятичных положительных...

Как правильно разделить входящее выражение на два и знак
Добрый день! Несколько дней уже мучаюсь с задачкой, не могу добить ее. Решил погуглить, гугля...

Подскажите, как правильно разделить числа и буквы?
Подскажите как правильно разделить числа и буквы? a = 'Z18a16z10R17d6P10'.lower() word = num...

4
Ушел с форума
Автор FAQ
16277 / 7602 / 1064
Регистрация: 11.11.2010
Сообщений: 13,617
09.12.2012, 08:59 2
AndreyD93, cwd применяется перед командой IDIV, в случае с делением беззнаковых чисел (используется команда DIV) нужно предварительно обнулить регистр DX командами MOV DX,0 или SUB DX,DX или XOR DX,DX и т.п.
0
17 / 17 / 1
Регистрация: 13.11.2012
Сообщений: 154
09.12.2012, 15:28  [ТС] 3
А для чего нужно занулять DX? В нем находиться остаток от деления?

Добавлено через 12 минут
Так будет правильно???
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
;f=(d*c-1)/(a*c-10)+a*b/c+a*c%d+b/d
;a=6fh 
;b=14  
;c=-93  
;d=46h
Data    Segment     
a       db       6fh
b       db       14
c       db       -93
d       db       46h
f       dw       ?
Data    Ends
Code    Segment   
ASSUME CS:Code,DS:Data 
start: 
       push DS
       xor AX,AX
       push AX  
       mov AX,Data
       mov DS,AX
 
       mov AL,a
       imul c
       sub AX,10
       mov BX,AX
       mov AL,d
       imul c
       dec AX
       cwd
       xor DX,DX
       div BX
       mov BX,AX    ;BX - (d*c-1)/(a*c-10)
       mov AL,a
       mul b
       xor AH,AH
       idiv c
       mov CL,AL    ;CL - a*b/c
       mov AL,a
       imul c
       xor AH,AH
       idiv d
       mov DL,AH    ;DL - a*c%d
       add CL,DL    ;CL - a*b/c+a*c%d
       mov AL,b
       cbw
       div d
       add AL,CL    ;AL - a*b/c+a*c%d+b/d
       cbw
       add BX,AX
       mov f,BX
 
   retf
Code Ends
End Start
0
Ушел с форума
Автор FAQ
16277 / 7602 / 1064
Регистрация: 11.11.2010
Сообщений: 13,617
09.12.2012, 15:37 4
AndreyD93,
  • нужно перечитать лекцию по командам DIV и IDIV или найти учебник по ассемблеру — при делении делимое всегда в два раза больше делителя
    делимое делитель
    регистр АХсодержимое регистра AL, BL, BH, CL, CH, DL, DH или ячейка памяти размером в байт
    регистры DX:AXсодержимое регистра AX, BX, CX, DI, SI, BP, SP или ячейка памяти размером в слово
    регистры EDX:EAXсодержимое регистра EAX, EBX, ECX, EDI, ESI, EBP, ESP или ячейка памяти размером в двойное слово
    регистры RDX:RAXсодержимое регистра RAX, RBX, RCX, RDI, RSI, RBP, RSP или ячейка памяти размером в учетверенноеное слово
  • если используешь IMUL вместо MUL — тогда используй и IDIV вместо DIV
1
17 / 17 / 1
Регистрация: 13.11.2012
Сообщений: 154
09.12.2012, 15:51  [ТС] 5
Спасибо, огромное) Я теперь понял свою ошибку))
0
09.12.2012, 15:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2012, 15:51
Помогаю со студенческими работами здесь

Как правильно сложить два больших (64 бита) числа?
Допустим есть два двоичных числа A и B. Размер каждого из них = 64 бита. Вопрос такой: 1) 64...

Разделить UINT16 на два числа
Здравствуйте. Есть число UINT16. Мне нужно из него получить два числа - первое это десятичное...

Разделить два числа (AVR)
Здравствуйте! Имеется такая задача -- нужно разделить одно число на другое. Проблема в том, что...

Ввести два числа. Разделить меньшее на большее
Всем привет. помогите пожалуйста с двумя задачами. 1.Ввести трехзначное число Вывести «да», если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru