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

При делении отрицательного числа выводит неправильный ответ. Если беру числа 127 13 10, пишет переполнение

13.07.2014, 21:02. Показов 1560. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
; (a+b)/c-2
 
_stack segment STACK
    dw 256 dup(0)
_stack ends
 
_data segment 
    msgA db 10, 13, "Input number A (-128..127): $"
    msgB db 10, 13, "Input number B (-128..127): $"
    msgC db 10, 13, "Input number C (-128..127): $"
    msgError db 10, 13, "Error: wrong number. ", 10, 13, 24h
    msgOver db 10, 13, "Error: overflow. ", 10, 13, 24h
    buf db 5, 5 dup (0)
    a db 0
    b db 0
    c db 0
    x db ?
    result db 10, 13, "Result: "
    res db " $"
    deg db 10
_data ends
 
_code segment
    assume ss: _stack, ds: _data, cs: _code
    
out_shortint proc
    push bx
    mov bx, dx
    cmp al, 0
    je mm3; переходим если число равно нулю
    jg mm1; переходим если число больше нуля
    mov byte ptr [bx], 2dh; записываем минус в строку вывода
    neg ax; инвертируем число
    inc bx; изменяем адрес записи
mm1:
    cmp al, 100; сравниваем число с сотней
    jl mm2; переходим если меньше
    xor ah, ah
    div deg; делим на 10
    add ah, 30h; преобразуем в код
    mov [bx+2], ah; записываем в строку вывода
 
mm2:
    xor ah, ah
    div deg; делим на 10
    ;xchg ah, al
    add ax, 3030h; преобразуем в код
    cmp al, 30h; опускаем ведущий нуль
    jne mm4; переход если нет вудущего нуля
    mov al, 20h; записываем пробел вместо нуля
 
mm4:
    mov word ptr [bx], ax; пишем в строку вывода
    jmp ex; переходим к выходу
 
mm3:
    mov word ptr [bx], 2030h; записываем нуль в строку вывода
ex:
    pop bx
    ret
out_shortint endp
 
input_shortint proc
    push bx
    push cx
    push si
    mov ax, 0A00h
    ;lea dx, buf
    int 21h
    mov bx, dx
    mov cl, [bx+1]
    mov si, 2
    xor ax, ax
    mov dl, buf[si]
    cmp dl, 2Dh 
    jne m1; переходим если неравны 
    inc si; пропускаем первый символ
    ;mov ax, word ptr buf[si]
    dec cl; уменьшаем счетчик
    
m1:
    mov dl, buf[si]; загружаем очередной символ
    cmp dl, 30h; сравниваем с кодом '0'
    jl m_error; переходим если меньше
    cmp dl, 39h; сравниваем с "9"
    jg m_error; переходим если больше
    xor dl, 30h; преобразуем в цифру
    add al, dl; складываем с предыдущим результатом
    cmp ax, 127; сравниваем с максимальным числом
    ja m_error; переходим если больше
    cmp cx, 1; проверяем счетчик на окончание цикла
    je m_con; переходим к концу цикла
    mul deg; умножаем результат на 10, если не конец цикла
 
m_con:
    inc si; инкрементируем индекс
    loop m1; повторяем если остались не рассмотренные символы
    mov dl, buf[2]; проверяем строку на отрицательное число
    cmp dl, 2Dh
    jne quit; выходим если введено положительное число
    neg al; инвертируем результат
    jmp quit; выход
 
m_error:
    lea dx, msgError; загружаем сообщение об ошибке
    mov ax, 900h; функция вывода строки
    int 21h; вызов дос
    mov ah, 1; признак ошибки ввода
quit:
    pop si; восстанавливаем регистры
    pop cx
    pop bx
    ret
input_shortint endp
 
main proc; главная процедура
    mov ax, _data; инициализация сегментного регистра данных
    mov ds, ax
    mov ax, 900h; вывод приглашения для ввода
    lea dx, msgA
    int 21h
    lea dx, buf; адрес буфера
    call input_shortint; вызов процедуры ввода числа
    cmp ah, 1; была ли ошибка при вводе
    je exit_error; выход при ошибке
    mov a, al; помещаем число в сегмент данных
 
    lea dx, msgB; вывод второго приглашения
    mov ax, 900h
    int 21h
    lea dx, buf
    call input_shortint
    cmp ah, 1
    je exit_error
    mov b, al; помещаем второе число в сегмент данных
 
    lea dx, msgC; вывод третьего приглашения
    mov ax, 900h
    int 21h
    lea dx, buf
    call input_shortint
    cmp ah, 1
    je exit_error
    mov c, al; помещаем третье число в сегмент данных
 
    mov al, a; помещаем a в аккумулятор
    add al, b; прибавляем b
    mov x, al
    jo outOver; проверяем переполнение
 
    cwd
    idiv c; делим на c
 
    jo outOver; проверяем переполнение
    sub al, 2; вычитаем 2
    jo outOver; проверяем переполнение
    jmp outN; переходим к выводу результата
 
outOver:
    lea dx, msgOver; загружаем сообщение об ошибке
    mov ax, 900h
    int 21h
    jmp exit_error
outN:
    lea dx, res
    call out_shortint
    mov ax, 900h
    lea dx, result
    int 21h
 
exit_error:
    mov ax, 4C00h
    int 21h
    ret
 
main endp
 
_code ends
 
end main
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.07.2014, 21:02
Ответы с готовыми решениями:

Если остаток при делении заданного числа на 3 больше 1, то утроить это число
Разработать блок-схему алгоритма, создать проект в VBA Если остаток при делении заданного числа на 3 больше 1, то утроить это число,...

Вложенный цикл. Найти трехзначные числа, которые при делении на 2 дают остаток 1, при делении на 3 остаток 2, при делении на 4 остаток 3
НАЙТИ С ПОМОЩЬЮ ВЛОЖЕННОГО ЦИКЛА))) найти асе трехзначные числа, которые при делении на 2 дают остаток 1,при делении на 3 остаток 2, при...

Для каждого введенного числа нужно ввести ответ "Да", если все числа четные, и ответ "Нет" в остальных случаях
(Без помощи массива)с клавиатуры по очереди вводятся пять трехзначных чисел. Для каждого введенного числа нужно ввести ответ...

2
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024
14.07.2014, 09:40
А если так?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
..........
    mov  al,c
    cbw
    mov  cx,ax
    mov  al,b
    cbw
    mov  bx,ax
    mov  al,a
    cbw
    add  ax,bx
    cwd
    idiv cx
    sub  ax,2
    mov  x,al
........
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
14.07.2014, 14:18
Цитата Сообщение от Dmitrinik Посмотреть сообщение
А если так?
Dmitrinik,
используйте команду movsx
Assembler
1
movsx cx,[c]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.07.2014, 14:18
Помогаю со студенческими работами здесь

Определение простоты числа (функция возвращает неправильный ответ)
Программа получает на вход число x и должна определить, является ли данное число простым. Написана программа, но для числа 155 выдаёт...

Нужно посчитать сумму чисел, в промежутке от первого отрицательного числа до второго отрицательного числа
Я сделал вроде как, но ответ неправильный. Где то написал неправильно. procedure TForm1.Button1Click(Sender: TObject); var ...

После ввода отрицательного числа все равно выдает ответ
Function Faktorial(x:integer):integer; Begin Var i,s:integer; s:=1; if x<0 then writeln('Аргумент должен быть положительным!'); ...

Найти все трехзначные числа, которые при делении на 2 дают остаток 1 и при делении на 3 остаток 2
Снова прощу о помощи . Работа в цикле. 1.Программа просит ввести любое число от 0 до 60 после чего подсчитывает сумму всех целых чисел...

Найти все числа, которые при делении на a дают остаток b, а при делении на b дают в остатке a
Ввести два натуральных числа a и b, на промежутке от 1 до N найти все числа, которые при делении на a дают остаток b, а при делении на b...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru