С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
HanDi
892 / 339 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
1

Проверка на знак числа (and, test)

17.05.2015, 20:20. Просмотров 1800. Ответов 8
Метки нет (Все метки)

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
and  bx,    8000h
js znakect
jns znakanet
 
znakect:
    mov   ah,09h  
    mov dx, offset int3
    int 21h
    jmp @end2
    
znakanet:
    mov   ah,09h  
    mov dx, offset int4
    int 21h
    jmp @end2
всегда выводит, что знака нет
почему так?

а если брать jz и jnz, то всегда знак есть
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2015, 20:20
Ответы с готовыми решениями:

проверка на четность и знак
если ли в асм стандартно как проверить на четность и знак ?

Nginx перенаправляет на http://site.ru/test.ru или http://test.ru/test.ru
Только, что поставил nginx + php-fpm по этой статье -...

Проверка на знак зодиака
Добрый день. Вообщем проблема такая: ввожу дату рождения в DATATimePicker а так...

Компоненты бинарного файла - вещественные числа. Изменить знак у каждого третьего числа на противоположный
Компоненты бинарного файла - вещественные числа. Изменить знак у каждого...

C:\Projects\test\test.cpp|6|error: ISO C++ forbids declaration of 'operator++' with no type [-fpermissive]|
class TUID { public: char Data; TUID (); operator ++ (); };

8
Ethereal
5134 / 1882 / 246
Регистрация: 17.02.2013
Сообщений: 2,799
17.05.2015, 21:48 2
Не может быть тут ошибки. В голову приходит только кривизна эмулятора, если ты вот это под ним запускаешь. Так-что давай подробности : полный текст программы, чем компилировал, где запускал.
0
HanDi
892 / 339 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
17.05.2015, 22:07  [ТС] 3
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
mov dx, ax
mov bx, ax
 
; проверка на четность
;test dx, dx;
and  dx,    0001h
jz chetnoe
jnz nechetnoe
 
chetnoe:
    mov   ah,09h  
    mov dx, offset int2
    int 21h
    jmp @znak
    
nechetnoe:
    mov   ah,09h 
    mov dx, offset int1
    int 21h
    jmp @znak
 
@znak:
; проверка на знак
;test bx, bx;
and  bx,    8000h
js znakect
jns znakanet
 
znakect:
    mov   ah,09h  
    mov dx, offset int3
    int 21h
    jmp @end2
    
znakanet:
    mov   ah,09h  
    mov dx, offset int4
    int 21h
    jmp @end2
 
@end2:
 
;mov   ah,09h           
;int   21h
 
mov     ax, 4c00h
int     21h
end     start
вот более подробнее

dosbox 0.74
tasm 1.4
0
Ethereal
5134 / 1882 / 246
Регистрация: 17.02.2013
Сообщений: 2,799
18.05.2015, 00:12 4
Цитата Сообщение от HanDi Посмотреть сообщение
mov bx, ax
Так, а это то число в AX, которое ты на знак проверяешь откуда берется ? То, которое в регистре AX при старте программы ?

Добавлено через 57 секунд
Я просил всю программу. А тут ее обрубок без начала выложил.

Добавлено через 10 минут
Нужна полная ситуация, когда конкретно, что-то работает неправильно. Что по твоему мнению работает неправильно ? Потому-что тот обрубок, что ты выложил, я дописываю и он работает правильно, хоть под Дос-Бокс, хоть нет.

Добавлено через 56 секунд
Да хоть откомпилированную программу архивом к посту прицепи и скажи "она работает так-то, а должна так-то".
0
HanDi
892 / 339 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
18.05.2015, 00:12  [ТС] 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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
masm
model   small
.386
.stack  100h
.data
 
f dw ?
x dw ?
y dw ?
k1 dw ?
k2 dw ?
 
error db "incorrect number$"
buff    db 6,7 Dup(?)
 
intx   db   'Input x:','$'
inty   db   'Input y:','$'
 
int1   db   ' - Nechetnoe','$'
int2   db   ' - Chetnoe','$'
int3   db   ' < 0','$'
int4   db   ' > 0','$'
 
.code
 
InputX proc 
 
    mov ah,0ah
    xor di,di
    mov dx,offset buff ; адрес буфера, смещение относительно начала сегмента данных
    int 21h ; принимаем строку
    mov dl,0ah
    mov ah,02
    int 21h ; выводим перевода строки
    
; обрабатываем содержимое буфера
    mov si,offset buff+2 ; берем адрес начала строки (+2 = после минуса)
    cmp byte ptr [si],"-" ; если первый символ минус (8b)
    jnz ii1
    mov di,1  ; устанавливаем флаг (потом проверим)
    inc si    ; и пропускаем его (след. символ)
ii1:
    xor ax,ax
    mov bx,10  ; основание сc
ii2:
    mov cl,[si] ; берем символ из буфера
    cmp cl,0dh  ; проверяем не последний ли он(enter)
    jz endin
    
; если символ не последний, то проверяем его на правильность
    cmp cl,'0'  ; если введен неверный символ <0
    jl er
    cmp cl,'9'  ; если введен неверный символ >9
    ja er
 
    sub cl,'0' ; делаем из символа число 
    mul bx     ; умножаем на 10
    add ax,cx  ; прибавляем к остальным
    inc si     ; указатель на следующий символ
    jmp ii2     ; повторяем
 
er:   ; если была ошибка, то выводим сообщение об этом и переходим к концу
    mov dx, offset error
    mov ah,09
    int 21h
    ;int 20h
    jmp @end2
 
; все символы из буфера обработаны число находится в ax
endin:
    cmp di,1 ; если установлен флаг, то
    jnz ii3
    neg ax   ; делаем число отрицательным
ii3:
    ret
 
InputX endp
 
InputY proc 
 
    mov ah,0ah
    xor di,di
    mov dx,offset buff ; адрес буфера, смещение относительно начала сегмента данных
    int 21h ; принимаем строку
    mov dl,0ah
    mov ah,02
    int 21h ; выводим перевода строки
    
; обрабатываем содержимое буфера
    mov si,offset buff+2 ; берем адрес начала строки (+2 = после минуса)
    cmp byte ptr [si],"-" ; если первый символ минус (8b)
    jnz ii1y
    mov di,1  ; устанавливаем флаг (потом проверим)
    inc si    ; и пропускаем его (след. символ)
ii1y:
    xor ax,ax
    mov bx,10  ; основание сc
ii2y:
    mov cl,[si] ; берем символ из буфера
    cmp cl,0dh  ; проверяем не последний ли он(enter)
    jz endiny
    
; если символ не последний, то проверяем его на правильность
    cmp cl,'0'  ; если введен неверный символ <0
    jl ery
    cmp cl,'9'  ; если введен неверный символ >9
    ja ery
 
    sub cl,'0' ; делаем из символа число 
    mul bx     ; умножаем на 10
    add ax,cx  ; прибавляем к остальным
    inc si     ; указатель на следующий символ
    jmp ii2y     ; повторяем
 
ery:   ; если была ошибка, то выводим сообщение об этом и переходим к концу
    mov dx, offset error
    mov ah,09
    int 21h
    ;int 20h
    jmp @end2
 
; все символы из буфера обработаны число находится в ax
endiny:
    cmp di,1 ; если установлен флаг, то
    jnz ii3y
    neg ax   ; делаем число отрицательным
ii3y:
    ret
 
InputY endp
 
OutInt proc
        
; проверяем число на знак.
   test    ax, ax
   jns     oi1     ; sf=0 (нет знака)
 
; если оно отрицательное, выведем минус и neg
   mov  cx, ax
   mov     ah, 02h
   mov     dl, '-'
   int     21h
   mov  ax, cx
   neg     ax
oi1:  
    xor     cx, cx ; cx - кол-во цифр
    mov     bx, 10 ; основание сс. 10 
oi2:
    xor     dx,dx
    div     bx
; делим число на основание сс. В остатке получается последняя цифра.
; сразу не выводим, сохраним её в стеке.
    push    dx
    inc     cx
; тоже самое, но до нуля
    test    ax, ax
    jnz     oi2
; можем выводить
    mov     ah, 02h
oi3:
    pop     dx
; извлекаем очередную цифру, переводим её в символ и выводим.
;; если сс > 10, т.е. для вывода требуется что-то кроме цифр
;   cmp     dl,9
;   jbe     oi4
;   add     dl,7
;oi4:
    add     dl, '0'
    int     21h
; повторим ровно столько раз, сколько цифр насчитали (cx)
    loop    oi3
    
    ret
 
OutInt endp 
 
start:
mov     ax, @data
mov     ds, ax          ; start prg
 
mov   ah,09h           
mov   dx,offset intx
int   21h
 
Call InputX
 
mov x, ax
xor ax, ax
 
mov   ah,09h           
mov   dx,offset inty
int   21h
 
Call InputY
 
mov y, ax
xor ax, ax
 
; sal ax, 1    ; умножить на 2
; sar ax, 1    ; разделить на 2
; rol ax, 1    ; циклически умножить на 2
; ror ax, 1    ; циклически разделить на 2
 
mov bx, x
mov ax, y
 
mov cl,6
sal bx,cl      ; x * 64
 
mov cl,5
sar bx, cl     ; 64 * x / 36
 
sub ax, bx
 
call OutInt
 
; test ax, 8000h  ; проверка старшего бита
; jz адрес1       ; не выставлен - число без знака
; test ax, 0001h  ; проверка младшего бита
; jz адрес2       ; не выставлен - число четное
 
;mov dx, ax
mov bx, ax
 
; проверка на четность
;test dx, dx;
and  dx,    0001h
jz chetnoe
jnz nechetnoe
 
chetnoe:
    mov   ah,09h  
    mov dx, offset int2
    int 21h
    jmp @znak
    
nechetnoe:
    mov   ah,09h 
    mov dx, offset int1
    int 21h
    jmp @znak
 
@znak:
mov bx, ax
; проверка на знак
;test bx, bx;
and  bx,    8000h
js znakect
jns znakanet
 
znakect:
    mov   ah,09h  
    mov dx, offset int3
    int 21h
    jmp @end2
    
znakanet:
    mov   ah,09h  
    mov dx, offset int4
    int 21h
    jmp @end2
 
@end2:
 
;mov   ah,09h           
;int   21h
 
mov     ax, 4c00h
int     21h
end     start
 
; F = y op1 k1 op2 x op3 k2   
; F = (y / 10) - (x * 32)       x = char; y = int
; F = y - (64 * x / 36)         x = int;  y = int
 
; int1   db   ' - Nechetnoe','$'
; int2   db   ' - Chetnoe','$'
; int3   db   '< 0','$'
; int4   db   '> 0','$'
0
Ethereal
5134 / 1882 / 246
Регистрация: 17.02.2013
Сообщений: 2,799
18.05.2015, 00:21 6
Поправь в двух местах вот это :
Assembler
1
2
3
    sub cl,'0' ; делаем из символа число 
    mul bx     ; умножаем на 10
    add ax,cx  ; прибавляем к остальным
на вот это
Assembler
1
2
3
4
    sub cl,'0' ; делаем из символа число в виде байта
    mov ch,0 ; превращаем его в слово
    mul bx     ; умножаем на 10
    add ax,cx  ; прибавляем к остальным
0
HanDi
892 / 339 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
18.05.2015, 00:27  [ТС] 7
результата не дало

Проверка на знак числа (and, test)
0
Ethereal
5134 / 1882 / 246
Регистрация: 17.02.2013
Сообщений: 2,799
18.05.2015, 00:34 8
У тебя просто коряво написано (я твой код прокомментировал) :
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
; проверка на четность
;test dx, dx;
and  dx,    0001h
jz chetnoe
jnz nechetnoe
 
chetnoe:
    mov   ah,09h                 ; испортил AH
    mov dx, offset int2
    int 21h                         ; испортил AL (эта функция AL портит, записывая в него 24h)
    jmp @znak
    
nechetnoe:
    mov   ah,09h                  ; испортил AH
    mov dx, offset int1
    int 21h                         ; испортил AL (эта функция AL портит, записывая в него 24h)
    jmp @znak
 
@znak:
mov bx, ax                        ;здесь уже в ax мусор (тонее 924h), причем 9 в AH запихал ты
; проверка на знак
;test bx, bx;
and  bx,    8000h                ;проверяем на знак мусор 924h (к слову он всегда положительный)
Добавлено через 29 секунд
Цитата Сообщение от HanDi Посмотреть сообщение
результата не дало
Еще бы. Это только самая первая ошибка была.

Добавлено через 1 минуту
Короче, ты на знак всегда число 924h проверял, а оно всегда положительное. Вот и ответ на твой вопрос - почему проверка на знак не работала.
1
HanDi
892 / 339 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
18.05.2015, 00:41  [ТС] 9
понял, добавлю стек, чтобы не терять
0
18.05.2015, 00:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2015, 00:41

Функция file_exists(test/01.ogg) работает, если папка test находится в корневом каталоге моего сервера.
Столкнулся с интересной проблеммой. Функция file_exists(test/01.ogg)...

Проверка что в текстбокс введен знак, не введена переменная или введено вещественное число
Уважаемые пользователи, помогите. Как вывести сообщение о том, что в...

Запишите в файл test.out все строки из файла test.in, в которых встречается слово "Hello"
В файле test.in записан текст на английском языке. Запишите в файл test.out все...


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

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

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