Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для kotenok
2 / 2 / 0
Регистрация: 07.06.2011
Сообщений: 47

[MASM] вроде все правильно, выводит ошибку деления ...

05.02.2012, 20:01. Показов 1797. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Задали слелать простую задачку на ассемблере (под 16 разрядный i8086)
Собственно пример: a/(b+a)-(2*a*b)/c
числа выбрала a = 8, b = 2, с =2; ответ -18

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
data segment
 
A db 8
B db 2
C db 2
mem db ?
mem2 db ?
 
data  ends
 
sst segment stack 
db 255 dup (?)
 
sst ends
 
code segment
assume ds:data, cs:code, ss:sst
 
metka:
mov ax, data
mov ds, ax
;---------------------------------
mov ah, A ; перемещаем 8ку в старший разряд AH 
add ah, B ; складываем 2ку и 8ку и результат в AH
mov mem, ah ; перемещаем результат сложения в mem
mov ah, A ; перемещаем А в ah дабы избежать путаницы
cbw ; --\\--
div mem ; делим 8 на сумму 8 и 2 в mem 
 
 
 
;---------------------------------
mov ax, 4C00h
int 21h
code ends
end metka
выдает ошибку деления...

Добавлено через 26 минут
Assembler
1
2
3
4
5
mov mem, ah ; перемещаем результат сложения в mem
 
mov al, a ; перемещаем А в ah дабы избежать путаницы
cbw ; --\\--
idiv mem ; делим 8 на сумму 10 в mem
вроде работает
если 8\10 = 0.8, то в debug вывод АХ 0800 ?

Добавлено через 36 минут
не правильно, поменяла числа на а = 2, б = 2, с = 4 - не работает... просто выводит в ah 2ку...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.02.2012, 20:01
Ответы с готовыми решениями:

Вроде все написала правильно, а значения не выводит совсем
Матрица A состоит из 7 строк и 8 столбцов. Найти максимальный элемент и подсчитать произведение элементов строки, в которой он находится. ...

Почему выдаёт ошибку? Вроде всё правильно!

Выдает ошибку но вроде все правильно посмотрите!
Задача в которой создается указатель второго порядка. #include <iostream> #include <conio.h> int main() { double...

11
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
05.02.2012, 20:16
не правильно, поменяла числа на а = 2, б = 2, с = 4 - не работает... просто выводит в ah 2ку...
a div (a+b)=2 div 4=0 - это в al
a mod (a+b)=2 mod 4=2 - это в ah
1
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
05.02.2012, 20:18
Цитата Сообщение от kotenok Посмотреть сообщение
не правильно, поменяла числа на а = 2, б = 2, с = 4 - не работает... просто выводит в ah 2ку...
Почему неправильно? Всё нормально: 2 / 4 = 0 в al и остаток 2 в ah.
1
 Аватар для kotenok
2 / 2 / 0
Регистрация: 07.06.2011
Сообщений: 47
05.02.2012, 20:47  [ТС]
Цитата Сообщение от Somebody Посмотреть сообщение
Почему неправильно? Всё нормально: 2 / 4 = 0 в al и остаток 2 в ah.
2\4 = 0,5
0 в al и 5 в ah ? нет?
точнее от вывел в ah 02
AX 0200
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
05.02.2012, 20:54
div - целочисленное деление
В al - частное
В ah - остаток от деления
1
 Аватар для kotenok
2 / 2 / 0
Регистрация: 07.06.2011
Сообщений: 47
06.02.2012, 00:42  [ТС]
Цитата Сообщение от kotenok Посмотреть сообщение
2\4 = 0,5
0 в al и 5 в ah ? нет?
поняла

дальше все понятно, хотя на таких глупых ошибках останавливаться так надолго както нехорошо...

Добавлено через 1 час 3 минуты
все работает, но в sub ошибка
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mov ah, A ; перемещаем 2ку в старший разряд AH 
add ah, B ; складываем 2ку и 2ку и результат в AH
mov mem, ah ; перемещаем результат сложения в mem
 
mov al, a ; перемещаем А в al дабы избежать путаницы
cbw ; --\\--
idiv mem ; делим 8 на сумму 10 в mem 
 
mov bx, ax
 
mov al, dva
mul a
mul b
cbw
idiv j
sub bx, al
j=c

Добавлено через 22 минуты
sub исправила, ответ не верен

Добавлено через 2 часа 18 минут
может кто проверит? буду благодарна
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
data segment
 
A db 2
B db 2
j db 4; j=с
 
dva db 2
mem db ?
mem2 db ?
 
data  ends
 
sst segment stack 
db 255 dup (?)
 
sst ends
 
code segment
assume ds:data, cs:code, ss:sst
 
metka:
;-------------------------------------------------------------#
mov ax, data
mov ds, ax
 
; --- Сложение ---
mov ah, A ; перемещаем; 2 => AH 
add ah, B ; складываем; 2+2=4 => AH
mov mem, ah ; перемещаем 4 в => mem
 
mov al, a ; перемещаем А в al дабы избежать путаницы
cbw ; AL => AX - преобразует в слово 
idiv mem ; 8\10 
 
mov bx, ax ; перемещаем результат деления из ах => bx
 
; --- умножение ---
mov al, dva ; => 2*2*2
mul a ; --\\--
mul b ; --\\--
 
; --- Деление ---
cbw   ; --\\--
idiv j ; разделить на 4 (8\4) = 2
 
; --- Вычитание ---
sub bx, ax ; вычитание результатов из BX и AX
 
 
mov ax, 4C00h
int 21h
;-------------------------------------------------------------#
code ends
end metka
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
06.02.2012, 06:19
mov bx, ax ; перемещаем результат деления из ах => bx
Тут либо
Assembler
1
movsx bx,al
либо
Assembler
1
movsx bx,ah
Аналогично для sub.

Добавлено через 2 минуты
Если используется idiv, тогда грамотнее будет использовать imul вместо mul.
1
 Аватар для kotenok
2 / 2 / 0
Регистрация: 07.06.2011
Сообщений: 47
06.02.2012, 06:52  [ТС]
Цитата Сообщение от murderer Посмотреть сообщение
Тут либо
Assembler
1
movsx bx,al
либо
Assembler
1
movsx bx,ah
Аналогично для sub.
чем отличается от mov?
если вы про
Assembler
1
mov bx, ax ; перемещаем результат деления из ах => bx
то заче половину регистра перемещать в "слово", т.е. в целый регистр ? вроде так нельзя, пробую
Если используется idiv, тогда грамотнее будет использовать imul вместо mul
div для чисел без знака, а idiv со знаком, аналогично для mul. Т.е. его нужно использовать только тогда когда ответ получается отричательным? или нет?
0
 Аватар для kotenok
2 / 2 / 0
Регистрация: 07.06.2011
Сообщений: 47
06.02.2012, 07:03  [ТС]
попробовала заменить на
Assembler
1
movsx ax, al;
и

Assembler
1
subsx ax, al;
не работает
Миниатюры
[MASM] вроде все правильно, выводит ошибку деления ...  
0
43 / 42 / 5
Регистрация: 22.06.2011
Сообщений: 71
06.02.2012, 08:04
Команды subsx нет. Команда пересылки с расширением знака movsx появилась впервые в процессорах i80386. Поэтому, чтобы воспользоваться командой movsx в тексте программы поставь директиву .386
1
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
06.02.2012, 12:19
то заче половину регистра перемещать в "слово", т.е. в целый регистр ?
ax = частное+остаток*256, а в bx нужно поместить только частное. Если я правильно понял.

Добавлено через 1 минуту
Тут
Assembler
1
sub bx, ax ; вычитание результатов из BX и AX
Можно сделать так
Assembler
1
2
cbw
sub bx, ax
1
 Аватар для kotenok
2 / 2 / 0
Регистрация: 07.06.2011
Сообщений: 47
06.02.2012, 19:45  [ТС]
Цитата Сообщение от murderer Посмотреть сообщение
Если я правильно понял.
оказывается, правильно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.02.2012, 19:45
Помогаю со студенческими работами здесь

Вроде все правильно но не работает
<!DOCTYPE html> <html> <head> <title>Переменные</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ...

Не выводит новое окно, все вроде бы должно работать но не работает
Помогите пожалуйста найти ошибку <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=windows-1251"> ...

Вроде всё правильно, а скрипт не работает
Помогите разобраться, if($_GET == "complete") { $p = date("H:i"); $sql = mysql_query("INSERT INTO bd...

Не понимаю, вроде бы все написано правильно
Привет всем, я тут столкнулся с одной проблемой и не знаю как ее решить.Может я просто, что - то упустил и был не особо внимателен, но...

Вроде все правильно, а работать не хочет
Всем джамбо. Есть 2 кода...оба не пашут на сайте, но вроде как работают на jsfiddle...На оба кода ошибка Property '$' of object is not a...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru