Я пишу код с использованием x64, который находит максимальное значение набора элементов данных. Я продолжаю получать - PullRequest
0 голосов
/ 10 октября 2019

Я работаю над кодом в x64, который находит максимальное количество набора элементов данных. В настоящее время я читаю Программирование с нуля, поэтому мне приходится конвертировать все из 32 в 64. Я получаю эту ошибку каждый раз, когда компилирую программу.

maximum.asm:22: error: comma, colon, decorator or end of line expected after operand
maximum.asm:22: error: comma, colon, decorator or end of line expected after operand
maximum.asm:28: error: comma, colon, decorator or end of line expected after operand
maximum.asm:28: error: comma, colon, decorator or end of line expected after operand
1 section .data
12         ;These are the data items
13
14 data_items:
15  db   3,67,34,222,45,75,54,34,44,33,22,11,66,0
16
17 section .text
18
19  global _start
20 _start:
21 mov $0, rdi                              
22 mov data_items(,rdi,8), rax             
23 mov rax, rbx                            
24
25 start_loop:                             
26 je loop_exit                             
27 inc rdi                               
28 mov data_items(,rdi,8), rax
29 cmp rbx, eax                            
30 jle start_loop                        
31 mov rax, rbx                            
32 jmp start_loop                         
33
34 loop_exit:
37 mov $1, rax
38 syscall
39

1 Ответ

2 голосов
/ 10 октября 2019

Это сочетание синтаксиса AT & T и Intel с использованием NASM db и директив раздела. NASM поддерживает только синтаксис Intel. https://stackoverflow.com/tags/intel-syntax/info

Кроме того, вы не можете портировать 32-битные системные вызовы Linux на x86-64, просто изменив int 0x80 на syscall. Соглашение о вызовах отличается, как и номера вызовов. Каковы соглашения о вызовах для системных вызовов UNIX и Linux на i386 и x86-64

Не пытайтесь переносить учебники на 64-битные, пока вы еще учитесьосновы! Просто соберите с nasm -felf32 foo.asm и gcc -m32 -static -nostdlib foo.o для создания 32-битных исполняемых файлов. Попытка портирования приведет только к дополнительным ошибкам и путанице.

IIRC, книга PGU использует 32-битный AT & T синтаксис, поэтому я бы рекомендовал использовать его вместо того, чтобы вообще переносить его на NASM. Два синтаксиса эквивалентны в том, что они могут делать;они оба могут представлять любую инструкцию машинного кода x86. Если вы думаете с точки зрения того, что может делать машина (например, масштабный коэффициент в режимах адресации - это двухбитный счетчик сдвигов), вам будет легче разобраться с различными синтаксисами и понять, почему существуют ограничения на то, что вы можете делать.


Кстати, db - список байтов. rax - регистр qword, 8 байтов. Вы, вероятно, хотите movzx eax, [esi] / inc esi или что-то для загрузки 1 байта за раз.

...