Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 1
Регистрация: 16.05.2009
Сообщений: 103
1

Не ясно действие строки "Ошибка переполнения"

16.05.2011, 15:26. Показов 671. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите, пожалуйста, как работает выделенная строчка? Почему именно такое условие?
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
title Lab_4 (Пасека Ксения и Хошимова Мунисса 621п, 2011)
.model large,C
LOCALS @@
;              b/a+1     , a<b
;        y=    25        , a=b
;             (a*a*a-5)/b  , a>b
CODESEG
EXTRN  C f:BYTE  ; Флажок "Деление на ноль": f=1
; Флажок "Переполнение при 16-разрядном умножении" f=2
 
 
; <<<<<<<<<<<<<<Данные знаковые!!!>>>>>>>>>>>>>>
public C lab4I
lab4I proc far
ARG a:WORD,b:WORD RETURNS y:WORD
    mov f,0                                 ;ok!
    mov ax,a                                ;<ax>=a
    mov bx,b                                ;<bx>=b
    cmp ax,bx                           ;сравнение a~b
    jg @@A_more_B                   ;a>b goto @@A_more_B
    jl @@A_less_B                   ;a<b goto @@A_less_B
    ;================== a = b ==================
    mov ax,25
    jmp short @@Exit
    ;================== a < b ==================
@@A_less_B:
    cmp ax,0                                ;сравнение a~0
    JE  @@ERROR                     ;a=0 goto @@ERROR
    mov ax,bx                               ;<ax>=b
    CWD
    IDIV a                                  ;<ax>=<dx:ax>/a
    ADC  ax,1                                   ;<ax>=b/a+1
    JC @@ERROR_perepoln
    jmp short @@Exit
    ;===================a > b ==================
@@A_more_B:
    cmp bx,0                                ;сравнение b~0
    JE  @@ERROR                     ;b=0 goto @@ERROR
    Imul a                                  ;<dx:ax>=a*a
    cmp dx,0                                ;сравнение <dx>~0
    JNE   @@ERROR_perepoln   ;Переполнение при знаковом умножении
    Imul a                                  ;<dx:ax>=a*a*a          
    sub  ax,5                               ;<ax>=<ax>-5
    sbb dx,00000h
    Idiv bx
    JC @@ERROR_perepoln                                     ;<ax>=(a*a*a-5)/b
    jmp short @@Exit
    ;=============== Деление на ноль =============
@@ERROR:
    mov f,1
    ret
    ;===Переполнение при 16-разрядном умножении ====
@@ERROR_perepoln:
    mov f,2
    ret
    ;============ Получение результата ===========
@@Exit:
    mov y,ax
    ret
    ;=========== Конец процедуры ================
lab4I endp
 
 
; <<<<<<<<<<<<<Данные БЕЗзнаковые!!!>>>>>>>>>>>>
public C lab4U
lab4U proc far
ARG a:WORD,b:WORD RETURNS y:WORD
    mov f,0                                 ;ok!
    mov ax,a                                ;<ax>=a
    mov bx,b                                ;<bx>=b
    cmp ax,bx                               ;сравнение a~b
    jA @@A_more_B                   ;a>b goto @@A_more_B
    jB @@A_less_B                   ;a<b goto @@A_less_B
    ;================== a = b ==================
    mov ax,25
    jmp short @@Exit
    ;================== a < b ==================
@@A_less_B:
    cmp ax,0                                ;сравнение a~0
    JE  @@ERROR                     ;a=0 goto @@ERROR
    mov ax,bx                               ;<ax>=b
    xor dx, dx
    DIV a                                       ; <ax>=<dx:ax>/a - ДЕЛЕНИЕ БЕЗЗНАКОВОЕ!!!!
    ADC  ax,1
    JC @@ERROR_perepoln                         ;<ax>=b/a+1
    jmp short @@Exit
    ;===================a > b ==================
@@A_more_B:
    cmp bx,0        A                       ;сравнение b~0
    JE  @@ERROR
    xor dx, dx                      ;a=0 goto @@ERROR
    mul a                                       ;<dx:ax>=a*a
    cmp dx,0                              ;сравнение <dx>~0
        JNE   @@ERROR_perepoln   ;Переполнение при БЕЗзнаковом умножении
    mul a                                       ;<dx:ax>=a*a*a
    SUB  ax,5                               ;<ax>=<ax>-5   (мл.часть)
    sbb  dx,00000h        ;!!!!!!!!   <dx>=<dx> +(ст.часть числа -5)
    div bx
    JC @@ERROR_perepoln                                     ;<ax>=(a*a*a-5)/b - ДЕЛЕНИЕ БЕЗЗНАКОВОЕ!!!!
    jmp short @@Exit
    ;=============== Деление на ноль =============
@@ERROR:
    mov f,1
    ret
;=============== Переполнение при 16-разрядном умножении =========
@@ERROR_perepoln:
    mov f,2
    ret
    ;=============== Получение результата =========
@@Exit:
    mov y,ax
    ret
    ;=========== Конец процедуры ================
lab4U endp
end
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2011, 15:26
Ответы с готовыми решениями:

строки Не ясно
1. у меня не выводится в Паскале ‘ поэтому не пойму что будет напечатано программой: var s:...

Не ясно, в чем ошибка. Застрял на активации
Сначала код был с таким условием: step=0.01; x=x+step и все работало. Потом я заменила таким...

Решение примера, не ясно где ошибка
Здравствуйте. Помогите,решаю пример. X=6*(A-2B+C/4)+10 Вот код: org 100h MOV AX, A MOV BX, B ...

Сложить X и CONST с анализом арифметического переполнения. Установить признак переполнения OVR
X - 8-битное число без знака, находящееся в ОЗУ по адресу ADR1, CONST - константа. Сложить X и...

0
16.05.2011, 15:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2011, 15:26
Помогаю со студенческими работами здесь

Сложить X и CONST с анализом арифметического переполнения. Установить признак переполнения OVR
Требуется только текст программы на ассемблере для решения задания! Заранее спасибо! X -...

Ошибка переполнения
С помощью форумчан написал все таки свою програмку,которая рисует график заданной функции. Но тут...

Ошибка переполнения
Всем привет! Делаю не большое приложение. Но проблема в чем : Когда я вбиваю данные в TextBoxt у...

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

Ошибка переполнения
Откройте файл acoustic.aip. Данный файл содержит числовые данные в формате записи uint16, с...

Ошибка переполнения
Происходит ошибка &quot;Переполнение&quot; на 53 строке, подскажите как это исправить. CLS PRINT &quot; Rac4et...

Ошибка переполнения
Выдает ошибку переполнение, как её можно исправить? Данное задание: Создать новый проект,...


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

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