Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 14.07.2011
Сообщений: 27

Поделить два числа ax, dx

01.06.2017, 23:40. Показов 1904. Ответов 1
Метки asm (Все метки)

Студворк — интернет-сервис помощи студентам
Доброй ночи. Ломаю голову неделю. Написал только 85% программы которая должна принимать два 16 битовых числа и рассчитывать по формуле A/B – 7*B

Проблема в том, что при попытке поделить:
A : 20 (mov ax, cx)
B : 2 (div bx)
= 6 (при любых вариантах)

А если писать так, например взять А, из введенного с клавиатуры, а второе число из регистра bl, то все хорошо делит
A : 20 (mov ax, cx)
mov bl, 2
B : 2 (div bl)
= 10

Как быть? Почему не делит?

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
data segment
    msgInputA db "Insert to value A: $"
    msgInputB db "Insert to value B: $"
    msgNumber db "Incorrect insert number$"
    buffer  db 6, 7 dup(?)
data ends
 
stk segment stack
    db 256 dup (?) 
stk ends
 
code segment
assume ds:data, cs:code, ss:stk
 
 
ShowHex proc
        push    ax
        push    cx
        push    dx
 
        ; Начинаем перевод числа AX в строку
        mov    cl,      ((16-1)/4)*4    ; 16-битный регистр, будем выводить по 4 бита (0..F)
        xchg   dx,      ax              ; Сохраняем число в DX
 
Repeat:
 
        mov    ax,      dx              ; Восстанавливаем число в AX
        shr    ax,      cl              ; Сдвигаем на CL бит вправо
        and    al,      0Fh             ; Получаем в AL цифру 0..15
        add    al,      '0'             ; Получаем в AL символ цифры
        cmp    al,      '9'             ; Проверяем цифру
        jbe    Digit09                ; Прыгаем, если это цифра 0..9
        add    al,      'A'-('9'+1)     ; Иначе (для A..F) корректируем ее
 
Digit09:
 
        int    29h                      ; Выводим символ в AL на экран
        sub    cl,      4               ; Уменьшаем CL на 4 для следующей цифры
        jnc    Repeat                 ; Если знаковый CL >= 0, то повторяем
 
        pop     dx
        pop     cx
        pop     ax
        ret
ShowHex endp
 
Insert proc
    ; Начало - Запись в буффер
    mov ah, 0ah ; ввод строки в буффер
    mov dx, offset buffer ; загрузим адрес буффера
    int 21h ; вызовем прерывание
    mov dl, 0ah ; ????
    mov ah, 02 ; загрузим перевод строки в регистр ah
    int 21h ; вызовем прерывание
    ; Конец - Запись в буффер
 
    ; Начало - Обработка информации из буфера
    mov si, offset buffer + 2 ; загрузим в регистровый указатель адрес буффера
    xor di, di  ; обнулим регистр
    cmp byte ptr [si], "-"    ; проверим на первый символ, если минус то:
    jnz negative
    inc di ; организуем смещение на один символ
    inc si    ; сместим указатель на еденицу
    ; Конец - Обработка информации из буфера
 
negative:
    xor ax, ax ; обнулим регистр
    mov bx, 10 ; основание cc
; Цикл прохода по каждому байту буффера, до нажатия кнопки Enter
loops:
    mov cl, [si] ; загрузим в счетчик символ из буффера
    cmp cl, 0dh  ; проверим является ли он последним, если да, то:
    je endin     ; перейдем, если ноль
 
    cmp cl, 30h  ; если меньше нуля, прыгнем на ошибку
    jl error     ; перейдем если не выше и не равно/ниже
    cmp cl, 39h  ; если больше девяти, прыгнем на ошибку
    ja error     ; перейдем если выше/не ниже и не равно
 
    sub cl, 30h  ; переконвертируем символ в число
    mul bx       ; умножим на десять
    add ax, cx   ; прибавим к остальным значениям в регистре
    
    inc si       ; пропустим следующий символ
    jmp loops    ; повторим до тех пор, пока не дойдем до нуля
error:
    mov dx, offset msgNumber ; вычисляем адрес и загружаем его в регистр
    mov ah, 09h   ; вывод строки
    int 21h      ; вызовем прерывание
    jmp exit
endin:
    cmp di, 1 ; проверим, было ли смещение (установлен ли флаг)
    jnz iend  ; если не ноль то завершаем
    neg ax    ; сделаем число негативным
iend:
    ret
Insert endp
 
; cx - A 
; bx - B
; A/B – 7*B.
Calc proc
    mov ax, cx
    div bч
    call ShowHex
    ret
Calc endp
 
main:    
    mov ax, data ; загрузим датасегмент в ax
    mov ds, ax   ; загрузим датасегмент из ax в ds
    xor ax, ax   ; обнулим 16-битовый регистр
 
    ; Начало - вывод сообщения
    mov dx, offset msgInputA ; вычисляем смещение (эффективный-адрес) и загружаем его в регистр
    mov ah, 9h ; вывод строки
    int 21h    ; прерывание DOS, получает управление, для обработки информации
    ; Конец - вывод сообщения
 
    ; Начало - Ввод А
    call Insert  ; запросим ввод символов
    mov cx, ax   ; загрузим результат ввода в регистр cx
    xor ax, ax   ; обнулим 16-битовый регистр
    ; Конец - Ввод А
 
    ; Начало - вывод сообщения
    mov dx, offset msgInputB ; вычисляем смещение (эффективный-адрес) и загружаем его в регистр
    mov ah, 9h ; вывод строки
    int 21h    ; прерывание DOS, получает управление, для обработки информации
    ; Конец - вывод сообщения
 
    ; Начало - Ввод B
    call Insert  ; запросим ввод символов
    mov bx, ax   ; загрузим результат ввода в регистр cx
    xor ax, ax   ; обнулим 16-битовый регистр
    ; Конец - Ввод B
 
    call Calc
    ; cx - A 
    ; bx - B
exit:
    mov ax, 4c00h
    int 21h
code ends
 
end main
Добавлено через 7 минут
Поправка: 104. div bx
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.06.2017, 23:40
Ответы с готовыми решениями:

Алгоритм для Машины Тьюринга: поделить два двоичных числа. Числа вводятся самим пользователем
Требуется поделить два двоичных числа (делимое и делитель). Числа вводятся самим пользователем. Не могу додумать как это все сделать,...

Даны два числа А и Б. Поделить А на Б используя только + и -
Даны два числа А и Б. Поделить А на Б используя только + и -

Поделить список на два: в первом числа, во втором символы
Добрый день! Имеем исходный список например: (a 1 b 2 c 3 d 4) нужно его разделить на два чтобы в первый список вошли только числа а во...

1
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
02.06.2017, 04:13
Цитата Сообщение от makar3000 Посмотреть сообщение
Ломаю голову неделю
За неделю вполне можно было и прогуглить формат инструкции DIV, из которого узнать, что если делитель - 16-битное число, то делимое должно располагаться в DX:AX, а не просто в AX.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2017, 04:13
Помогаю со студенческими работами здесь

Как поделить два натуральных числа, используя вычитание
Здравствуйте! Подскажите новичку, как поделить 2 натуральных числа используя только вычитание. Какой составить алгоритм?

Поделить два числа, но если второе число ноль, вернуть -1
#include <iostream> using namespace std; int func(int x); int main() { int y,x; cin >> y; cin >> x; ...

Поделить числовой список на два, относительно числа введенного с клавиатуры
помогите пожалуйста!!!поделить числовой список на два,относительно числа введенного с клавиатуры?нужно написать программу в visual prologe

Поделить жесткий диск на два
Добрый вечер форумчане. Вопрос такой! Приобрел компьютер в магазине. Сразу установлена ОС Windows 7. Жесткий естественно 1. Хочу поделить...

Поделить два элемента массива выбранных пользователем
Сперва необходимо создать и вывести на экран целочисленный массив определенной пользователем размерности, заполненный случайными числами в...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru