Форум программистов, компьютерный форум, киберфорум
Наши страницы

Assembler: Linux

Войти
Регистрация
Восстановить пароль
 
 
compressor
1 / 1 / 0
Регистрация: 19.08.2014
Сообщений: 53
#1

Ошибка при проверке значения после bsr - Assembler

12.08.2017, 14:38. Просмотров 325. Ответов 15

Для поиска "контрольной точки" и создания матрицы написан код
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
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
;yasm -f elf64 -g dwarf2 -a x86 parse.asm -o parse.o
;ld -o parse parse.o
 
%macro  multipush 1-*
  %rep  %0
        push    %1
  %rotate 1
  %endrep
%endmacro
 
%macro  multipop 1-*
  %rep %0
  %rotate -1
        pop     %1
  %endrep
%endmacro
    
%macro mbmov 2
%ifnidni %1, %2
        mov %1, %2
%endif
%endmacro
 
%macro fcall 1
        call %1
%endmacro
 
%macro fcall 2
        mbmov rdi, %2
        call %1
%endmacro
 
%macro fcall 3
        mbmov rdi, %2
        mbmov rsi, %3
        call %1
%endmacro
 
%macro fn 0
        mov rax, $              ; Addr of start of fn
        multipush rdi, rsi, rdx, r10, r8, r9, rbx, rcx
        push rax                ; Address of start of function
        push rbp
        mov rbp, rsp
%endmacro
    
%macro fn 1
        fn
        mbmov %1, rdi
%endmacro
 
%macro fnret 0
        mov rsp, rbp
        pop rbp
        add rsp, 8              ; Pop off the start addr of function
        multipop rdi, rsi, rdx, r10, r8, r9, rbx, rcx
        ret
%endmacro
%macro fnret 1
        mov rax, %1
        fnret
%endmacro
 
%macro WriteLit 2+
        section .rodata
%%str: db %2
%%len: equ $ - %%str
        section .text
        multipush rbp, rdi, rsi, rdx, r10, r8, r9, rbx, rcx
        mov rax, SYS_WRITE
        mov rdi, %1
        mov rsi, %%str
        mov rdx, %%len
        syscall
        multipop rbp, rdi, rsi, rdx, r10, r8, r9, rbx, rcx
%endmacro
    
%macro proc 0
        mov rax, $              ; Addr of start of fn
                ;        multipush r12, r13, r14, r15, rcx, rdx
        push rax                ; Address of start of function
        push rbp
        mov rbp, rsp
%endmacro
 
%macro proc 1
        proc
        mbmov rax, %1
%endmacro
 
%macro proc 2
        proc %1
        mbmov rdi, %2
%endmacro
%macro proc 3
        proc %1, %2
        mbmov rsi, %3
%endmacro
%macro proc 4
        proc %1, %2, %3
        mbmov rdx, %4
%endmacro
    
%macro procret 0
        mov rsp, rbp
        pop rbp
        add rsp, 8              ; Pop off the start addr of function
                ;        multipop r12, r13, r14, r15, rcx, rdx
        ret
%endmacro
 
    %define A 0x490c8cc00003249f
    %define B 0x16405a10256a239f
    %define C 0xd36319c281858089
    %define D 0x80c84408bb498080
    %define E 0x87783f4d0d828080
    %define F 0x79004d1580ae1225
    %define G 0x8080808080c45224
    %define H 0xf78180b222120580
    %define J 0x08bb498080d36319
    %define K 0x3b0580808080c944
    %define L 0x522479004d1580ea
    %define M 0x8080808080b10fc4
    %define N 0x1af68180b2221205
    %define O 0x2502bb498080f821
    %define P 0x91450180808080fd
    %define I 0xd0176378004d1580
    %define Q 0x058080808080f502
    %define R 0x211af68180b32212
    %define S 0xb40a03bb498080fb
    %define T 0x1580f23080808080
    %define Y 0x9501b44c4178004d
    %define U 0x2212058080808080
    %define W 0x80b4221af78180b4
    %define Z 0x808080f309bb4980
    %define X 0x004d15809a400080
    %define V 0x80808090ec620479
    %define AA 0x80b52212058080
    global _start
    segment .data
    pack    dq A,B,C,D,E,F,G,H,J,K,L,M,N,O,P,I,Q,R,S,T,Y,U,W,Z,X,V,AA
    len equ $ - pack
    count_seq_num       dd  0x0003249a
    count_dup_seq_num   dd  0x0003249a
    noentr_num      dq  6
    act_num         dq  7
    check_point_num     dq  20
    step            dq  9
 
    new_line    db  0x0a
    new_line_len    equ $ - new_line
 
    space       db  0x20
    space_len   equ $ - space
    
    segment .bss
    segment .text
_start:
    mov rsi, pack
    mov rcx, len
    xor rdx,rdx
    mov dword edx, [rsi]
                ;   push rdx
                ;   mov rdi, rdx
                ;   call Write_dec
                ;   pop rdx     ;
    mov r15d, [count_seq_num]
    mov r14d, [count_dup_seq_num]
Increment:
    inc edx
    inc r15d
    inc r14d
    cmp edx, r15d
    je Parse
    cmp edx, r14d
    je Remake_count
    mov dword r14d, edx
    jmp Increment
exit:
    call Write_new_line
    mov rdi, 0
    mov rax, 0x3c
    syscall
 
Remake_count:
    mov dword r15d, edx
    jmp Increment
 
Parse:
    ;;  push rbx
    mov rdi, rdx
    call Write_space
    call Write_dec
    ;;  pop rbx
    
    add rsi, 4
    sub rcx, 4
    xor r10, r10
search_stop_bit_loop:
    
    xor rdx, rdx
    mov byte dl, [rsi]
    bsr rax, rdx
    cmp rax, 0x7
    je field_separator
    dec rcx
    inc rsi         ;
    xor r8, r8
    shrd r8, rdx, 7     ;
    shld rbx, r8, 7     ;
    jmp search_stop_bit_loop
 
field_separator:
    xor r8, r8
    shrd r8, rdx, 7
    shld rbx, r8, 7
    dec rcx
    inc rsi
    inc r10         
    push rbx
    mov rdi, rbx
    call Write_space
    call Write_dec
    pop rbx
    xor r11, r11
    mov r11, [noentr_num]
    cmp r10, r11
    je Parse_body
    
    xor rbx, rbx
    cmp rcx, 1
    je exit
    
    jmp search_stop_bit_loop
 
Parse_body:
    call Body
    jmp exit
 
Body:
    push rbp
    mov rbp, rsp
    multipush rax, rdi, rsi, rdx, r10, r8, r9, r11, r12, r13, r14, r15, rbx, rcx
 
body_stop_bit_loop:
    
    xor rdx, rdx
    mov byte dl, [rsi]
    bsr rax, rdx
    cmp rax, 0x7
    je body_field_separator
    dec rcx
    inc rsi         ;
    xor r8, r8
    shrd r8, rdx, 7     ;
    shld rbx, r8, 7     ;
    jmp body_stop_bit_loop
 
body_field_separator:
    xor r8, r8
    shrd r8, rdx, 7
    shld rbx, r8, 7
    dec rcx
    inc rsi
    inc r10
    ;;; ;;;;
    xor r11, r11
    mov r11, [act_num]
    cmp r10, r11
    je act_update
    ;;
    xor r11, r11
    mov r11, [check_point_num]
    cmp r10, r11
    je check_update
    ;; 
    push rbx
    call Write_space    ;   
    mov rdi, rbx
    call Write_dec
    pop rbx
    
    xor rbx, rbx
    cmp rcx, 1
    je body_exit
    
    jmp body_stop_bit_loop
 
body_exit:
    multipop rax, rdi, rsi, rdx, r10, r8, r9, r11, r12, r13, r14, r15, rbx, rcx
    leave
    ret
act_update:
    call action
    xor rbx, rbx
    jmp body_stop_bit_loop
action: 
    push rbp
    mov rbp, rsp
    multipush rax, rdi, rsi, rdx, r10, r8, r9, r11, r12, r13, r14, r15, rbx, rcx
    push rbx
    call Write_space
    call Write_new_line
    mov rdi, rbx
    call Write_dec
    pop rbx
action_exit:
    multipop rax, rdi, rsi, rdx, r10, r8, r9, r11, r12, r13, r14, r15, rbx, rcx
    leave
    ret 
 
check_update:
    call check_point
    xor rbx, rbx
    jmp body_stop_bit_loop
check_point:
    push rbp
    mov rbp, rsp
    multipush rax, rdi, rsi, rdx, r10, r8, r9, r11, r12, r13, r14, r15, rbx, rcx
    
    push rbx
    call Write_space    
    mov rdi, rbx
    call Write_dec
    pop rbx
    xor rax, rax
    bsr rax, rbx
    cmp rax, 0x40
    ;; в этом месте условие не срабатывает и каждый раз идет переход на inc_num
    jb inc_num      ;меньше, идем добавлять 1
     
    xor r11, r11
    mov r11, [act_num]
    add r11, 9
    mov qword [act_num], r11
check_exit:
    multipop rax, rdi, rsi, rdx, r10, r8, r9, r11, r12, r13, r14, r15, rbx, rcx
    leave
    ret
inc_num:
    call add_one
    jmp check_exit
add_one:
    push rbp
    mov rbp, rsp
    multipush rax, rdi, rsi, rdx, r10, r8, r9, r11, r12, r13, r14, r15, rbx, rcx
    xor r8, r8
    mov r8, [check_point_num]
    inc r8
    mov qword [check_point_num], r8
    multipop rax, rdi, rsi, rdx, r10, r8, r9, r11, r12, r13, r14, r15, rbx, rcx
    leave
    ret
 
Write_dec:
     WriteDec:
    fn rax
_WriteDec_CharLoop:
        sub rsp, 1
        mov rdx, 0
        mov r8, 10
        div r8
        add rdx, '0'
        mov [rsp], dl
        cmp rax, 0              ; Write at least 1 char (test at end)
        je _WriteDec_EndLoop
        jmp _WriteDec_CharLoop
_WriteDec_EndLoop:
        mov rax, 0x1      ; Write
        mov rdi, 0x1
        mov rsi, rsp
        mov rdx, rbp
        sub rdx, rsp
    syscall
    
        fnret
 
Write_new_line:
    push rbp
    mov rbp, rsp
    multipush rax, rdi, rsi, rdx, r10, r8, r9, r11, r12, r13, r14, r15, rbx, rcx
    mov rdx, new_line_len
    mov rsi, new_line
    mov rdi, 0x1
    mov rax, 0x1
        syscall
    multipop rax, rdi, rsi, rdx, r10, r8, r9, r11, r12, r13, r14, r15, rbx, rcx
    leave
    ret
Write_space:
    push rbp
    mov rbp, rsp
    multipush rax, rdi, rsi, rdx, r10, r8, r9, r11, r12, r13, r14, r15, rbx, rcx
    mov rdx, space_len
    mov rsi, space
    mov rdi, 0x1
    mov rax, 0x1
        syscall
    multipop rax, rdi, rsi, rdx, r10, r8, r9, r11, r12, r13, r14, r15, rbx, rcx
    leave
    ret
но в строке 328 операция сравнения не работает, то есть не зависимо от ее результата код переходит к метке inc_num, как это исправить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2017, 14:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при проверке значения после bsr (Assembler):

Ошибка при проверке - Mathematica
∞ Ʃ ((-1)^n) *((x^n)/((2*n)!)) n=0 an=((-1)^n) *((x^n)/((2*n)!)) an-1=((-1)^n-1) *((x^n-1)/((2*n-1)!)) ...

Почему при проверке заполнения массива выводятся неправильные значения? - C++
// ConsoleApplication15.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> ...

Компьютер зависает при проверке на ошибки после загрузки - Windows XP
После перезагрузки компьютера она начинает проверять диски на ошибки, зависает на 2 стадии на 0%, при этом индикатор жесткого диска (HDD...

Ошибка при проверке метаданных - 1С
После создания формы появилась такая ошибка. Кто-то сталкивался? или посоветуете переделать все сначала?

Ошибка при проверке на существование - PHP
Вот код: if (mysql_query("SELECT * FROM `".$db_prefix."sites` WHERE `link` = `".$url_site."`")) { exit("<p>Такой сайт уже...

Ошибка при проверке диапазона - Pascal
Program p1; var a:array of integer; x,y,m,i:integer; begin writeln('введите колличество чисел, но не болше 100') readln(m); ...

15
Jin X
Евгений, Самара
1266 / 520 / 109
Регистрация: 14.12.2014
Сообщений: 1,427
Завершенные тесты: 2
12.08.2017, 19:42 #2
Такого быть не может. Почему решил, что не срабатывает?
Числа-то беззнаковые? Потому как если знаковые, то при rax=-1 переход должен быть и надо юзать jl, а не jb.
0
ФедосеевПавел
Модератор
2478 / 1381 / 571
Регистрация: 01.02.2015
Сообщений: 4,696
12.08.2017, 19:46 #3
Фирма intel подкупила меня. Т.к. сумма подкупа небольшая, то ограничусь лишь переименованием темы "Не работает команда CMP" - иначе разорится огромная компания.

Вы бы локализовали фрагмент спорного кода и сделали бы тестовую программу на 10-15 строк.
Как понимаю, после
Assembler
327
    bsr rax, rbx
в rax должно быть число от 0 до 63 (0x00...0x3f). Подозреваю, что это и есть причина.
0
Jin X
Евгений, Самара
1266 / 520 / 109
Регистрация: 14.12.2014
Сообщений: 1,427
Завершенные тесты: 2
12.08.2017, 19:46 #4
А, ну собственно (только сейчас посмотрел код чуть выше)... Там идёт bsr rax,rbx, т.е. запись в rax номера бита и потом уже cmp. Естественно, номер бита будет всегда < 0x40 (64).
1
compressor
1 / 1 / 0
Регистрация: 19.08.2014
Сообщений: 53
12.08.2017, 20:22  [ТС] #5
Если там 0, то сравнение некорректно, так как единиц нет. Вариант - cmp rbx, 0x80000000, тоже не дает результата. При jl программа идет без остановки, не взирая на условия. При jb - ошибка сегментирования.
0
ФедосеевПавел
Модератор
2478 / 1381 / 571
Регистрация: 01.02.2015
Сообщений: 4,696
12.08.2017, 20:28 #6
Вы подрываете моё доверие к Intel и AMD.

Если нужно сравнить только знаковый бит rbx, то
Assembler
1
2
    or rbx, rbx
    js метка
0
compressor
1 / 1 / 0
Регистрация: 19.08.2014
Сообщений: 53
12.08.2017, 21:13  [ТС] #7
При сравнении идет cmp rbx,0xffffffff80000000, поэтому практически всегда rbx меньше. Замена на десятичное 2147483648 результата не дает, все равно остается 0xffffffff80000000. Как его записать чтобы сравнивать 64 битные числа, например числа с 1 в 40 бите?
0
ФедосеевПавел
Модератор
2478 / 1381 / 571
Регистрация: 01.02.2015
Сообщений: 4,696
12.08.2017, 21:44 #8
Еще раз, сформулируйте задачу. Если нужно проверить знак числа в rbx, то ранее уже приведён пример. Если нужно проверить установку одного бита, то
Assembler
1
2
    test rbx, 0x0800000
    jz метка
Если нужно проверить установку ровно 3 бит, то
Assembler
1
2
3
4
    mov rax, rbx
    and rax, маска
    cmp rax, маска
    je метка
0
compressor
1 / 1 / 0
Регистрация: 19.08.2014
Сообщений: 53
12.08.2017, 21:54  [ТС] #9
Задача заключается в том, что "контрольные точки" - числа с 1 в битах от 38 до 50, каждый раз по разному. И расположены они на каком то диапазоне - от 20 до 25 числа по порядку. Нужно вычислить порядковый номер "контрольные точки" для дальнейшего построения матрицы.
Пока решение критического участка видится таким
Assembler
1
2
3
4
5
6
7
8
9
10
...
        xor rax, rax
    ;bsr rax, rbx
    mov rax, 0xffffffffffffffff
    shr rax, 26
    cmp rbx, rax
    
    ;; в этом месте условие не срабатывает и каждый раз идет переход на inc_num
    jl inc_num      ;меньше, идем добавлять 1
...
0
ФедосеевПавел
Модератор
2478 / 1381 / 571
Регистрация: 01.02.2015
Сообщений: 4,696
12.08.2017, 22:17 #10
Ничего не понятно. Откуда в регистре rbx взялись числа от 20 до 25?

Цитата Сообщение от compressor Посмотреть сообщение
числа с 1 в битах от 38 до 50
Так возьмите битовую маску
Assembler
1
2
3
    mov rax, rbx
    shr rax, 38
    and rax, 0b1111111111111
А всё остальное - непонятно, что требуется.
0
compressor
1 / 1 / 0
Регистрация: 19.08.2014
Сообщений: 53
13.08.2017, 07:43  [ТС] #11
rcx - это длина сообщения в байтах, r10 - количество полей в сообщении. Они не совпадают, потому что поле может быть байтом, словом, двойным или четверным словом. 20 - 25 это номера полей или r10, им соответствуют rbx - значения поля. Посмотрю как использовать маску.
0
Jin X
Евгений, Самара
1266 / 520 / 109
Регистрация: 14.12.2014
Сообщений: 1,427
Завершенные тесты: 2
13.08.2017, 11:10 #12
Цитата Сообщение от compressor Посмотреть сообщение
Задача заключается в том, что "контрольные точки" - числа с 1 в битах от 38 до 50, каждый раз по разному.
Хорошая привычка – перечитывать свои сообщения. Вот что тут написано – попробуй разберись... И в чём задача?
Что нужно проверить конкретно в этом участке? Что такое поле? Такого понятия нет в ассемблере. Есть регистр (rbx, например), есть биты. Что нужно проверить?
0
ФедосеевПавел
Модератор
2478 / 1381 / 571
Регистрация: 01.02.2015
Сообщений: 4,696
13.08.2017, 11:26 #13
Скорее всего, это продолжение Удаление бита. Там и описание протокола приведено. Только какое-то смутное описание.
0
compressor
1 / 1 / 0
Регистрация: 19.08.2014
Сообщений: 53
13.08.2017, 16:37  [ТС] #14
Да, продолжение.
0
Jin X
Евгений, Самара
1266 / 520 / 109
Регистрация: 14.12.2014
Сообщений: 1,427
Завершенные тесты: 2
13.08.2017, 18:33 #15
compressor, так что конкретно нужно сделать? Только понятным языком. Чтоб 5-классник гуманитарий понял
0
13.08.2017, 18:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2017, 18:33
Привет! Вот еще темы с ответами:

Ошибка при проверке массива - C++
sf::String *TileMap = new sf::String; for (size_t i = 0; i &lt; 15; i++) { TileMap = &quot; &quot;; } for (int i = 0; i &lt;...

Ошибка 216 при проверке - Free Pascal
Выдает 216-ю ошибку,не могу понять,в чем причина. uses crt; type TElint = byte; TElelem = double; PTelem = ^TElelem; ...

.NET 4.x Раные значения при проверке программы маткадом являются правильным решением - C#
Имеется программа на C# для расчета верхнего пределна интегрирования. Однако при проверке MathCAD оказывается, что есть 2 верных значения...

Ошибка при проверке элемента структуры - C (СИ)
в общем есть структура. struct rost { char family; char pol; int cm; }; вводим


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

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

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