Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
tatu_cat_69
0 / 0 / 0
Регистрация: 16.11.2009
Сообщений: 7
1

Сравнение двух знаковых чисел

03.12.2010, 13:06. Просмотров 4814. Ответов 5
Метки нет (Все метки)

задание такое:нужно сравнить два знаковых числа. числа в пределах от -9 до 9, т.е. надо сделать защиту от дурака

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
STACKS SEGMENT PARA STACK 'STACK'   
    DB 512 DUP   (?)
STACKS ENDS
 
DATA SEGMENT PARA 'DATA'
    
    STR1 DB  'VVEDITE 1-oe znakovoe  chislo      $'
        STR2 DB  'VVEDITE 2-oe znakovoe chislo      $'
        STR3 DB  'min chislo     $'
    chislo1 dw  ?
    chislo2 dw  ?
        BUF DB 20,?,20 DUP ('$')
    buf2 db 20,?,20 dup ('$')
    
DATA ENDS
 
CODE SEGMENT PARA PUBLIC 'CODE'
    ASSUME CS:CODE,DS:DATA,SS:STACKS
 
entr PROC NEAR ;процедура перехода на новую строку
         MOV AH,2
     MOV DL,13
     INT 21H
     MOV DL,10
     INT 21H
     RET
entr ENDP
 
 
 
 
 
MAIN PROC FAR;  
    MOV AX,DATA
    MOV DS,AX
vvod_1:
        ;-----------------
    MOV AH,9                ;код функции (вывод строки)
    MOV DX,OFFSET STR1                   
        INT 21H
        ;-----------------
 
    CALL entr  ; Переход на новую строку
 
    MOV AH,0AH; 
    MOV Dx,OFFSET BUF;  это работа с буфером, его заполняем строкой
    mov chislo1,dx
        INT 21H
    MOv AX,0
        MOV Al,BYTE PTR BUF+1           ;помещение длины строки в AX
    cmp al,1 ;сравниваем длину строки
    Ja otriz ;если больше 1, то это отрицательное число
    cmp al,1
    je polog ;если нет, то положительное
    
polog:  cmp buf+2, 30h ;защита от дурака, т.е. если код символна меньше кода 0, то повторно вводим
    jb vvod_1
    cmp buf+2, 39h ;аналогично с кодом 9
    ja vvod_1
    jmp end_if              
    
otriz:  cmp al,2 ;сравниваем длину с 2
    je otriz1 ; если равно 2 то это отрицательное и тогда проверяем
    jmp vvod_1
otriz1: cmp buf+2, 2dh ;сравниваем первый символ с кодом "-"
    jne vvod_1  
    cmp buf+3, 2dh ;защита от дурака, чтобы не вводили "--"
    je vvod_1
    jmp end_if
end_if: 
    CALL entr  ; Переход на новую строку
 
;-----------------
 
vvod_2:        ;-----------------
    MOV AH,9                ;код функции (вывод строки)
    MOV DX,OFFSET STR2 
    mov chislo1,dx                  
        INT 21H
        ;-----------------
 
    CALL entr  ; Переход на новую строку
 
    MOV AH,0AH; 
    MOV DX,OFFSET BUF;  это работа с буфером, его заполняем строкой
    
        INT 21H
;------ аналогично для второго числа проверяем.
    MOv AX,0
        MOV Al,BYTE PTR BUF+1           ;помещение длины строки в AX
    cmp al,1
    Ja otriz_11
    cmp al,1
    je polog_1
    
polog_1:    
    cmp buf+2, 30h
    jb vvod_2
    cmp buf+2, 39h
    ja vvod_2
    jmp end_if1             
    
otriz_11:   cmp al,2
    je otriz_21
    jmp vvod_2
otriz_21:
    cmp buf+2, 2dh
    jne vvod_2  
    cmp buf+3, 2dh
    je vvod_2
    jmp end_if1
end_if1:                        ;конец проверки 
;вот тут начались проблемы. не понимаю как вывести и сравнить. почитал про вывод знаковых не понял.
    CALL entr  ; Переход на новую строку
    MOV AH,2                        ;
    MOV Dx,chislo1                  ;Вывод на экран num1
    ADD Dx,30h                      ;
    INT 21h
CALL entr 
    MOV AH,9
    MOV DX,OFFSET STR3    ;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        INT 21H
    
    mov ax,chislo2
    cmp ax,[chislo1]
    Jge proc_min_out
    
    MOV AH,2
    MOV DX,ax;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
    INT 21H
proc_min_out:
    mov ax,chislo1  
        MOV AH,2
    MOV DX,ax;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        INT 21H
    mov ah,4ch
    int 21h
 
 
MAIN ENDP
CODE ENDS
END MAIN
END MAIN
проблема с выводом чисел знаковых и сравнением. подскажите как это сделать. статью на форуме читал. не понял как сделать.

Добавлено через 16 минут
vital792, если можешь то помоги. очень надо
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2010, 13:06
Ответы с готовыми решениями:

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

Найти остаток от деления двух без знаковых чисел, не используя команды mul, div
привет, нужно найти остаток от деления двух без знаковых чисел, не используя...

Сравнение двух чисел
Никогда не работал с Ассемблером, а тут понадобилось написать...

Сравнение двух чисел
Народ помогите написать код:

определить наибольшее из трех двухбайтных знаковых чисел
нужно определить наибольшее из трех двухбайтных знаковых чисел вот что у меня...

5
vital792
2002 / 1274 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
03.12.2010, 13:41 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
...
        Ja otriz ;если больше 1, то это отрицательное число
        
polog:  cmp buf+2, 30h ;защита от дурака, т.е. если код символна меньше кода 0, то повторно вводим
        jb vvod_1
        cmp buf+2, 39h ;аналогично с кодом 9
        ja vvod_1
    mov al, byte ptr [buf+2]
    sub al, 30h
    cbw
    mov chislo1, ax
        jmp end_if                              
        
otriz:  cmp al,2 ;сравниваем длину с 2
        je otriz1 ; если равно 2 то это отрицательное и тогда проверяем
        jmp vvod_1
otriz1: cmp buf+2, 2dh ;сравниваем первый символ с кодом "-"
        jne vvod_1      
        cmp buf+3, 2dh ;защита от дурака, чтобы не вводили "--"
        je vvod_1
        mov al, byte ptr [buf+3]
    sub al, 30h
    neg al
    cbw
    mov chislo1, ax
end_if: 
        CALL entr  ; Переход на новую строку
...
так же для второго числа. Затем сравниваете их
Assembler
1
2
3
mov ax, chislo1
cmp ax, chislo2
jge ...
и выводите на экран процедурой отсюда http://www.cyberforum.ru/assembler/thread54461.html
1
tatu_cat_69
0 / 0 / 0
Регистрация: 16.11.2009
Сообщений: 7
03.12.2010, 14:45  [ТС] 3
блин, что-то с выводом проблемы.

и выводит он минимальное странно. тупо второе число если меньше то выводит нормально.
0
vital792
2002 / 1274 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
03.12.2010, 15:01 4
Цитата Сообщение от tatu_cat_69 Посмотреть сообщение
блин, что-то с выводом проблемы.
и выводит он минимальное странно. тупо второе число если меньше то выводит нормально.
покажи код как сравниваешь, как выводишь
0
tatu_cat_69
0 / 0 / 0
Регистрация: 16.11.2009
Сообщений: 7
03.12.2010, 15:11  [ТС] 5
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
STACKS SEGMENT PARA STACK 'STACK'   
    DB 512 DUP   (?)
STACKS ENDS
 
DATA SEGMENT PARA 'DATA'
    
    STR1 DB  'VVEDITE 1-oe znakovoe  chislo      $'
        STR2 DB  'VVEDITE 2-oe znakovoe chislo      $'
        STR3 DB  'min chislo     $'
    chislo1 dw  ?
    chislo2 dw  ?
        BUF DB 20,?,20 DUP ('$')
    buf2 db 20,?,20 dup ('$')
    
DATA ENDS
 
CODE SEGMENT PARA PUBLIC 'CODE'
    ASSUME CS:CODE,DS:DATA,SS:STACKS
 
entr PROC NEAR ;процедура перехода на новую строку
         MOV AH,2
     MOV DL,13
     INT 21H
     MOV DL,10
     INT 21H
     RET
entr ENDP
 
 
 
 
 
MAIN PROC FAR;  
    MOV AX,DATA
    MOV DS,AX
vvod_1:
        ;-----------------
    MOV AH,9                ;код функции (вывод строки)
    MOV DX,OFFSET STR1                   
        INT 21H
        ;-----------------
 
    CALL entr  ; Переход на новую строку
 
    MOV AH,0AH; 
    MOV Dx,OFFSET BUF;  это работа с буфером, его заполняем строкой
    mov chislo1,dx
        INT 21H
    MOv AX,0
        MOV Al,BYTE PTR BUF+1           ;помещение длины строки в AX
    cmp al,1 ;сравниваем длину строки
        Ja otriz ;если больше 1, то это отрицательное число
        
polog:  cmp buf+2, 30h ;защита от дурака, т.е. если код символна меньше кода 0, то повторно вводим
        jb vvod_1
        cmp buf+2, 39h ;аналогично с кодом 9
        ja vvod_1
        mov al, byte ptr [buf+2]
        sub al, 30h
        cbw
        mov chislo1, ax
        jmp end_if                              
        
otriz:  cmp al,2 ;сравниваем длину с 2
        je otriz1 ; если равно 2 то это отрицательное и тогда проверяем
        jmp vvod_2
otriz1: cmp buf+2, 2dh ;сравниваем первый символ с кодом "-"
        jne vvod_1      
        cmp buf+3, 2dh ;защита от дурака, чтобы не вводили "--"
        je vvod_1
        mov al, byte ptr [buf+3]
        sub al, 30h
        neg al
        cbw
        mov chislo1, ax
end_if: 
        CALL entr  ; Переход на новую строку
 
;-----------------
 
vvod_2:        ;-----------------
    MOV AH,9                ;код функции (вывод строки)
    MOV DX,OFFSET STR2 
    mov chislo1,dx                  
        INT 21H
        ;-----------------
 
    CALL entr  ; Переход на новую строку
 
    MOV AH,0AH; 
    MOV DX,OFFSET BUF;  это работа с буфером, его заполняем строкой
    
        INT 21H
;------ аналогично для второго числа проверяем.
    MOv AX,0
        MOV Al,BYTE PTR BUF+1           ;помещение длины строки в AX
    cmp al,1 ;сравниваем длину строки
        Ja otriz11 ;если больше 1, то это отрицательное число
        
polog1:  cmp buf+2, 30h ;защита от дурака, т.е. если код символна меньше кода 0, то повторно вводим
        jb vvod_2
        cmp buf+2, 39h ;аналогично с кодом 9
        ja vvod_2
        mov al, byte ptr [buf+2]
        sub al, 30h
        cbw
        mov chislo1, ax
        jmp end_if1                              
        
otriz11:  cmp al,2 ;сравниваем длину с 2
        je otriz21 ; если равно 2 то это отрицательное и тогда проверяем
        jmp vvod_2
otriz21: cmp buf+2, 2dh ;сравниваем первый символ с кодом "-"
        jne vvod_2      
        cmp buf+3, 2dh ;защита от дурака, чтобы не вводили "--"
        je vvod_2
        mov al, byte ptr [buf+3]
        sub al, 30h
        neg al
        cbw
        mov chislo1, ax
end_if1: 
        CALL entr  ; Переход на новую строку
 
;вот тут начались проблемы. не понимаю как вывести и сравнить. почитал про вывод знаковых не понял.
    CALL entr  ; Переход на новую строку
    MOV AH,2                        ;
    MOV Dx,chislo1                  ;Вывод на экран num1
    ADD Dx,30h                      ;
    INT 21h
CALL entr 
    MOV AH,9
    MOV DX,OFFSET STR3    ;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        INT 21H
    
    mov ax,chislo1
    cmp ax,chislo2
    Jg proc_min_out
    jl proc_min_out1
    
    MOV AH,2
    MOV DX,ax;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
    INT 21H
proc_min_out:
    
        MOV AH,2
    mov cx,chislo2  
    MOV DX,cx;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        add dx,30h
    INT 21H
    mov ah,4ch
    int 21h
    jmp endid
proc_min_out1:
    MOV AH,2
    mov cx,chislo1  
    MOV DX,cx;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
    add dx,30h
        INT 21H
    mov ah,4ch
    int 21h
    jmp endid
endid:
MAIN ENDP
CODE ENDS
END MAIN
END MAIN
если можешь то подправь его просто
0
vital792
2002 / 1274 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
03.12.2010, 15:53 6
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
...
vvod_2:        ;-----------------
        MOV AH,9                                ;код функции (вывод строки)
        MOV DX,OFFSET STR2 
        INT 21H
        ;-----------------
 
        CALL entr  ; Переход на новую строку
 
        MOV AH,0AH; 
        MOV DX,OFFSET BUF;  это работа с буфером, его заполняем строкой
        
        INT 21H
;------ аналогично для второго числа проверяем.
        MOv AX,0
        MOV Al,BYTE PTR BUF+1                   ;помещение длины строки в AX
        cmp al,1 ;сравниваем длину строки
        Ja otriz11 ;если больше 1, то это отрицательное число
        
polog1:  cmp buf+2, 30h ;защита от дурака, т.е. если код символна меньше кода 0, то повторно вводим
        jb vvod_2
        cmp buf+2, 39h ;аналогично с кодом 9
        ja vvod_2
        mov al, byte ptr [buf+2]
        sub al, 30h
        cbw
        mov chislo2, ax
        jmp end_if1                              
        
otriz11:  cmp al,2 ;сравниваем длину с 2
        je otriz21 ; если равно 2 то это отрицательное и тогда проверяем
        jmp vvod_2
otriz21: cmp buf+2, 2dh ;сравниваем первый символ с кодом "-"
        jne vvod_2      
        cmp buf+3, 2dh ;защита от дурака, чтобы не вводили "--"
        je vvod_2
        mov al, byte ptr [buf+3]
        sub al, 30h
        neg al
        cbw
        mov chislo2, ax
end_if1: 
        CALL entr  ; Переход на новую строку
 
;вот тут начались проблемы. не понимаю как вывести и сравнить. почитал про вывод знаковых не понял.
        CALL entr  ; Переход на новую строку
        MOV AH,9
        MOV DX,OFFSET STR3    ;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        INT 21H
 
        mov ax,chislo1
        cmp ax,chislo2
        Jg proc_min_out1
    mov ax, chislo1
        jmp out_min
proc_min_out1:
    mov ax, chislo2
out_min:
    or ax, ax
    jns ns1
    push ax
    mov dl, '-'
    mov ah, 2
    int 21h
    pop ax
    neg ax
ns1:
    mov dl, al
    add dl, 30h
    mov ah, 2
    int 21h
 
    xor ax, ax
    int 16h
        mov ah,4ch
        int 21h
Добавлено через 1 минуту
а вообще для chislo1 и chislo2 лучше выделять по одному байту
0
03.12.2010, 15:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2010, 15:53

Напишите макроопределение mVyvod, которое производит сравнение двух чисел и отображает строку с нулевым окончанием
Напишите макроопределение mVyvod, которое производит сравнение двух чисел и...

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

Сравнение двух строк
помогите пожалуйста с заданием Даны две строки по длине не превышающие 255...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru