- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于Mac上的x64汇编,我还很陌生,因此对于在64位中移植一些32位代码感到困惑。
该程序应仅通过C标准库中的printf
函数打印出一条消息。
我从以下代码开始:
section .data
msg db 'This is a test', 10, 0 ; something stupid here
section .text
global _main
extern _printf
_main:
push rbp
mov rbp, rsp
push msg
call _printf
mov rsp, rbp
pop rbp
ret
$ nasm -f macho64 main.s
main.s:12: error: Mach-O 64-bit format does not support 32-bit absolute addresses
section .data
msg db 'This is a test', 10, 0 ; something stupid here
section .text
global _main
extern _printf
_main:
push rbp
mov rbp, rsp
mov rax, msg ; shouldn't rax now contain the address of msg?
push rax ; push the address
call _printf
mov rsp, rbp
pop rbp
ret
nasm
命令可以很好地进行编译,但是现在将带有
gcc
的目标文件编译到实际程序时出现警告:
$ 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
a.out
文件:
$ ./a.out
Segmentation fault: 11
最佳答案
64位OS X ABI大体上符合System V ABI - AMD64 Architecture Processor Supplement。它的代码模型与小位置无关代码模型(PIC)非常相似,其区别在于here。在该代码模型中,所有本地数据和小数据都可以使用RIP相对寻址直接访问。如Z Boson的评论所述,用于64位Mach-O可执行文件的镜像库超出了虚拟地址空间的前4 GiB,因此push msg
不仅是将msg
的地址放入堆栈的一种无效方法,但是这也是不可能的,因为PUSH
不支持64位立即数。该代码应该看起来类似于:
; this is what you *would* do for later args on the stack
lea rax, [rel msg] ; RIP-relative addressing
push rax
RDI
,
RSI
,
RDX
,
RCX
,
R8
和
R9
中。前8个浮点或矢量参数进入
XMM0
,
XMM1
,...,
XMM7
。仅在使用了所有可用寄存器或存在不适合任何这些寄存器的参数(例如80位
long double
值)之后,才使用堆栈。 64位立即推送是使用
MOV
(
QWORD
变体)而不是
PUSH
执行的。简单的返回值将传递回
RAX
寄存器中。调用方还必须为被调用方提供堆栈空间,以保存一些寄存器。
printf
是一个特殊的函数,因为它接受可变数量的参数。调用此类函数时,应将
AL
(RAX的低字节)设置为在向量寄存器中传递的浮点参数的数量。另请注意,相对于代码的2 GiB之内的数据,首选
RIP
相对寻址。
gcc
在OS X上将
printf("This is a test\n");
转换为程序集的方式:
xorl %eax, %eax # (1)
leaq L_.str(%rip), %rdi # (2)
callq _printf # (3)
L_.str:
.asciz "This is a test\n"
%
开头,数据宽度被编码为指令名称的后缀)
(1)
处将零放入
AL
中(通过将整个RAX设置为零,以避免部分寄存器延迟)。在
(2)
处,字符串的地址被加载到
RDI
中。请注意,该值实际上是如何从
RIP
的当前值偏移的。由于汇编器不知道该值是什么,因此它将重定位请求放入目标文件中。链接器然后看到重定位,并在链接时放置正确的值。
default rel ; make [rel msg] the default for [msg]
section .data
msg: db 'This is a test', 10, 0 ; something stupid here
section .text
global _main
extern _printf
_main:
push rbp ; re-aligns the stack by 16 before call
mov rbp, rsp
xor eax, eax ; al = 0 FP args in XMM regs
lea rdi, [rel msg]
call _printf
mov rsp, rbp
pop rbp
ret
关于macos - x64 nasm : pushing memory addresses onto the stack & call function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13091987/
我的团队正在使用 gerrit 代码审查,本质上这意味着默认的推送行为会绕过标准工作流程,因此我们需要使用 git push origin HEAD:refs/for/feature 来正确推送我们的
我是 assembly 新手,我正在使用 MASM。我看到这些代码行,想知道这之间有什么区别 a) push myVar b) push [myVar] c) push OFFSET myVar 我怎
美好的一天! 将镜像推送到docker hub时遇到一些问题。我的第一个软件版本: vagrant@debian-8-docker:~$ docker version Client version:
我有三个 Controller 一二三 .首先是navigationController的rootViewController。 在 SecondViewController ,我有一个名为 的协议(
我在这个 Google 教程的帮助下实现了一个 Web Push API: https://developers.google.com/web/fundamentals/getting-started
我有两个模式: var optionsSchema = new Schema({ locationname: String, locationnumber : String
我是 git 的新手并对其进行了测试。我已经能够克隆 friend 存储库进行小的本地更改并提交。 我现在想测试将我的本地更改推送到远程存储库,但不幸的是当我尝试进行推送时 $ git push <
我们正在公司讨论 git rebase 之后该做什么。在rebase之后,您需要将更改推送到远程origin,但是当git不允许时我们应该怎么做呢?实际上,我们正在讨论当分支已经被推送时我们最常用的两
我正在使用具有嵌入式 github 支持的新 IDE。在命令行本地,我可以成功地使用 git push orgin master 并更新 github。但是我的 IDE 使用带有 -v 标志的命令,这
我仍在阅读有关 RoR 的一些指南,我被困在 Deploying The Demo App 上 我遵循了说明: With the completion of the Microposts resour
我正在尝试创建一个可以将我的 git 存储库镜像到另一个存储库的脚本。一切正常,但它一直在说 [remote rejected] refs/pull/xx/head -> refs/pull/xx/h
我想了解使用 Tortoise SVN 构建过程的一些过程。主要是 我想知道你是否插入: 主线中继 QA 后的一个分支将其抓取到本地的工作副本中并测试该分支,然后一些构建推送该分支 我遇到的问题是我在
在谈论将消息推送到移动应用程序以触发 WAP 内容的下载时,似乎都使用了 WAP 推送和 SMS 推送这两个术语。 这些术语是指相同的机制还是具有不同的含义? 最佳答案 SMS Push 是告诉终端发
我只是想知道是否有人使用这种技术: 由于推送通知仅随 OS 3.0 一起提供,因此我一直在考虑使用电子邮件推送(Exchange、mobile.me)作为解决方法: 您可以注册一个 URL,例如。 m
我正在 build WP website using DIVI theme .应该被插入 dataLayer 的标签被默认的“未设置”值卡在某个地方。 为了推送我使用脚本的值: functi
我最近删除了xcode 6 beta 3并安装了xcode 6 beta 6 当我在终端输入gitpush时,这发生了 xcrun:错误: Activity 的开发人员路径(“/Application
我即将实现ionic-native Push Notifications .这可以在浏览器中运行吗?还是我需要安装 iOS/Android 模拟器? 最佳答案 除非您使用 Phonegap 推送服务器
Safari 12.1 是否支持服务 worker PWA 推送通知?我试过这个 demo在 iOS 上,但它仍然不适合我。 有机会得到它们吗?谢谢。 最佳答案 目前没有关于此功能的通信...Appl
目前我有很多 chrome 浏览器的推送订阅都是这样的方法, swr.pushManager.subscribe({userVisibleOnly: true}) .then(function
我需要 4 个过渡效果,但我只知道 2 个过渡效果,还有 2 个我不知道。我知道的 2 个过渡动画是: 过渡时下推: 并向下推过渡: 但
我是一名优秀的程序员,十分优秀!