assembly - 我正在使用 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
解决方案
这是 AT&T 和 Intel 语法的混合,并使用 NASMdb
和节指令。NASM 仅支持 Intel 语法。 https://stackoverflow.com/tags/intel-syntax/info
此外,您不能将 Linux 32 位系统调用移植到 x86-64,只需更改int 0x80
为syscall
. 调用约定不同,电话号码也不同。 i386 和 x86-64 上 UNIX 和 Linux 系统调用的调用约定是什么
当您还在学习基础知识时,不要尝试将您的教程移植到 64 位! 只需构建nasm -felf32 foo.asm
并gcc -m32 -static -nostdlib foo.o
制作 32 位可执行文件。尝试移植只会引入额外的错误和混乱。
IIRC,PGU 书使用 32 位 AT&T 语法,所以我建议只使用它而不是将其移植到 NASM。这两种语法在它们可以做的事情上是等价的;它们都可以表示任何 x86 机器代码指令。如果您考虑机器可以做什么(例如,寻址模式中的比例因子是 2 位移位计数),则更容易处理学习不同的语法并理解为什么限制您可以做什么。
顺便说一句,db
是一个字节列表。rax 是一个 qword 寄存器,8 个字节。您可能希望movzx eax, [esi]
/inc esi
或某事一次加载 1 个字节。
推荐阅读
- google-chrome - Chrome 未按预期在 HTTPS 上处理“308 - 永久重定向”重定向
- c# - .Net Web 应用程序和 Oracle Access Manager Webgate 通信
- c# - 如何将二维数组转换为 ObservableCollection
- r - 有没有办法在 R 中重新编码 SPSS 函数以创建单个新变量?
- java - Vertx HttpRequest .basicAuthentication() 与 .putHeader("Authorization", "...")
- java - Java 函数式编程:如何将 for 循环中的 if-else 阶梯转换为函数式?
- angular - 自定义错误处理程序提供程序似乎没有使用 --prod 标志进行实例化
- python - 如何重新排序 .wav 文件通道
- c# - 下载多个 zip 文件 asp.net
- sql - 将两行以上合并为一行并将正确的数据放入右列