- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用以下命令在我的Mac计算机上运行此代码:
nasm -f macho64 -o max.a maximum.asm
section .data
data_items:
dd 3,67,34,222,45,75,54,34,44,33,22,11,66,0
section .text
global _start
_start:
mov edi, 0
mov eax, [data_items + edi*4]
mov ebx, eax
start_loop:
cmp eax, 0
je loop_exit
inc edi
mov eax, [data_items + edi*4]
cmp eax, ebx
jle start_loop
mov ebx, eax
jmp start_loop
loop_exit:
mov eax, 1
int 0x80
maximum.asm:14: error: Mach-O 64-bit format does not support 32-bit absolute addresses
maximum.asm:21: error: Mach-O 64-bit format does not support 32-bit absolute addresses
最佳答案
首先,注意带有macho64输出格式和64-bit absolute addressing (NASM 2.13.02+)和RIP-relative in NASM 2.11.08的NASM错误。不建议使用64位绝对寻址,因此,即使对于有故障的NASM 2.13.02及更高版本,此答案也应适用。 (这些错误不会导致此错误,它们会导致在运行时使用错误的地址。)[data_items + edi*4]
是32位寻址模式。甚至[data_items + rdi*4]
也只能使用32位绝对位移,因此它也不起作用。请注意,使用地址作为类似于 cmp rdi, data_items
is also a problem的32位(符号扩展)立即数:仅mov
允许64位立即数。
OS X上的的64位代码不能完全使用的32位绝对地址。可执行文件在高于4GiB的基地址上加载,因此标签地址仅是普通格式,不适合带有零或符号扩展名的32位整数。无论您是否需要与RIP无关,RIP相对寻址都是最佳/最有效的解决方案。
在NASM中,文件顶部的 default rel
将使所有[]
内存操作数更喜欢RIP相对寻址。另请参见NASM手册中的Section 3.3 Effective Addresses。
default rel ; near the top of file; affects all instructions
my_func:
...
mov ecx, [data_items] ; uses the default: RIP-relative
;mov ecx, [abs data_items] ; override to absolute [disp32], unusuable
mov ecx, [rel data_items] ; explicitly RIP-relative
lea rsi, [rel data_items]
。
lea rsi, [data_items] ; can be outside the loop
...
mov eax, [rsi + rdi*4]
add rsi, 4
并使用更简单的寻址模式,例如
mov eax, [rsi]
。
mov rsi, data_items
可用于将地址添加到寄存器中,但是您不希望这样做,因为它效率较低。
lea rbx, [arr1]
/.../
mov eax, [rbx + rdi*4 + arr2-arr1]
。
Relative Addressing errors - Mac 10.10提到Agner Fog的“优化程序集”指南中有一些数组寻址的示例,包括一个使用
__mh_execute_header
作为引用点的示例。 (该问题中的代码看起来像是另一种尝试,将这个32位Linux示例从PGU本书移植到64位OS X,同时首先学习了asm。)
mov eax, [array + rdi*4]
或
mov edi, symbol_name
之类的代码,或者在
http://gcc.godbolt.org/上看到编译器输出。
gcc -pie -fPIE
将在Linux和
is the default on many recent distros上创建与位置无关的可执行文件,但不能创建Godbolt。
[disp32]
寻址模式,则我会提及它。
[rsi + rdi*4]
,而不是
[esi + edi*4]
。您通常不希望将指针截断为32位,并且它花费了额外的地址大小前缀来进行编码。
syscall
而不是
int 0x80
进行64位系统调用。
What are the calling conventions for UNIX & Linux system calls on i386 and x86-64表示传递args的寄存器的区别。
ld
链接到的
gcc main.o
警告:
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not
allowed in code signed PIE, but used in _main from main.o. To fix this warning,
don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
mov r64, imm64
较大(10个字节),但不比
lea r64, [RIP_rel32]
(7个字节)快。
mov rsi, qword data_items
代替相对于RIP的LEA,LEA的运行速度几乎一样快,并且在代码缓存和uop缓存中占用的空间更少。 64位立即数也对Sandybridge-family(
http://agner.org/optimize/)进行uop缓存获取:这需要2个周期来读取uop缓存行,而不是1个周期。
mov
形式,可从64位绝对地址加载/存储到64位绝对地址,但仅适用于AL/AX/EAX/RAX。参见
http://felixcloutier.com/x86/MOV.html。您也不希望这样做,因为它比
mov eax, [rel foo]
更大且不快。
关于nasm - Mach-O 64位格式不支持32位绝对地址。 NASM访问阵列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47300844/
我正在尝试手写 Mach-O 可执行文件。加载命令共有三个: LC_SEGMENT_64正在加载__PAGEZERO LC_SEGMENT_64 加载 __TEXT,带有单个 __text 部分 LC
从 objc 源代码我们可以看到 SEL 被定义为 typedef struct objc_selector *SEL; 我用 idaq 反汇编了我的 dylib ,我确实调用了 _MSHookMes
我正在尝试在 Mach 上的两个进程之间发送消息(准确地说,这是带有 Mach 微内核的 Debian GNU/Hurd),这是我的代码: #define _GNU_SOURCE #include
我对使用信号量感兴趣,它是使用 mach/semaphore.h 中的 semaphore_create(task, sem, policy, value) 创建的,在共享内存中用于在 Mac OS
我想在共享内存中使用匿名信号量来同步多个进程。 虽然多个 POSIX 操作系统提供匿名信号量(通过 sem_init 和相关函数),但 macOS 不支持它们。 我发现 Mach 信号量在 macOS
我正在尝试将 mach 端口传递给使用 fork 创建的子进程在 Mac OSX 上。我看到了这个问题 Sharing Mach ports with child processes但它没有解决方案,
构建应用程序时生成的 dsym 文件的结构是什么。我知道它包含 DWARF 调试信息,但什么是 dsym 文件。我想阅读其中的 DWARF 信息。 它只是一个只包含调试部分的 Mach-O 二进制文件
当 SOVERSION 的文档出现时,我正在考虑对一个小型个人项目的共享库进行版本控制。 target 属性提到在 OS X 和 iOS 等 Mach-O 系统上,对应的是“兼容版本”,而 VERSI
我正在尝试实现在项目中发现的openssl代码,但这些链接器错误并没有消失。我检查了框架是否正确链接,甚至使用../lib和../include手动包含了库和 header 搜索路径。尽管如此,当我摆
这个问题已经有答案了: Mach-O 64-bit format does not support 32-bit absolute addresses. NASM Accessing Array (1
我正在寻找有关如何设计 Mac OS X 网络内核扩展的特定部分以尽可能快速和高效的建议或指示 - C 语言。 描述:我有两套 TAILQ 列表。一个用于 A 型结构,另一个用于 B 型结构。大多数情
我有一个用 C++ 编写的服务器,它在 osx 上运行时会泄漏 Mach 端口。具体来说,运行时 top我注意到它有大约 50000(在 #PORTS 下)。奇怪的是,我让它运行了一夜,第二天机器基本
我修改了CoreData数据集,并向无错误的iPhone应用程序添加了两个新类。现在,当我尝试编译时,出现此错误: Apple Mach-OP Linker Error Linker command
我正在对 Mac OS X 上可用的不同 IPC 机制(管道、套接字、System V IPC 等)进行比较,我想看看 Mach 端口与更高级别的替代方案相比如何。但是,我遇到了一个非常基本的问题:跨
升级到Xcode 8.3.2后,尝试在设备上运行时,我收到了Apple Mach-O链接程序警告(它正在模拟器上运行)。但是我没有得到任何细节。双击该错误不会带来有关链接器警告的更多信息。有人可以帮忙
我有 2 张 table 。 表1 共有约 2700 行 列:ID、NO、NAME 表2: 共有约 300 行 列:ID、NAME 地点: Table1.NO = Table2.ID 我想列出 Tab
我在我的 iOS 应用程序中使用了一些第三方库(库有 flurry、chartboost 和burSTLy)。所有这些第三方库都有静态库,我通过将它们添加到“将二进制与库链接”中来将它们包含在我的项目
Undefined symbols for architecture x86_64: "_BFTaskMultipleExceptionsException", referenced from:
我正在尝试设置一条 mach 消息,以使用 mach IPC 发送越界的字符串。但是,在尝试发送越界消息时,我收到了 (ipc/send) invalid msg-header 错误。 这是消息结构。
为什么 SELECT * , MATCH(tags) AGAINST('php' IN BOOLEAN MODE) .. etc 不返回任何东西(而 php 标签存在于许多行中) 和 SELECT *
我是一名优秀的程序员,十分优秀!