首页 > 解决方案 > 我正在使用 x64 编写代码,以查找一组数据项的最大值。我不断得到一个

问题描述

我正在研究 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

标签: assemblyx86-6432bit-64bitgnu-assembleratt

解决方案


这是 AT&T 和 Intel 语法的混合,并使用 NASMdb和节指令。NASM 仅支持 Intel 语法。 https://stackoverflow.com/tags/intel-syntax/info

此外,您不能将 Linux 32 位系统调用移植到 x86-64,只需更改int 0x80syscall. 调用约定不同,电话号码也不同。 i386 和 x86-64 上 UNIX 和 Linux 系统调用的调用约定是什么

当您还在学习基础知识时,不要尝试将您的教程移植到 64 位! 只需构建nasm -felf32 foo.asmgcc -m32 -static -nostdlib foo.o制作 32 位可执行文件。尝试移植只会引入额外的错误和混乱。

IIRC,PGU 书使用 32 位 AT&T 语法,所以我建议只使用它而不是将其移植到 NASM。这两种语法在它们可以做的事情上是等价的;它们都可以表示任何 x86 机器代码指令。如果您考虑机器可以做什么(例如,寻址模式中的比例因子是 2 位移位计数),则更容易处理学习不同的语法并理解为什么限制您可以做什么。


顺便说一句,db是一个字节列表。rax 是一个 qword 寄存器,8 个字节。您可能希望movzx eax, [esi]/inc esi或某事一次加载 1 个字节。


推荐阅读