请问在 mac 环境下学习汇编的环境

2015-02-16 11:14:20 +08:00
 sidenycc
教材用的是Professional Assembly Language,用的是AT&T语法,无奈各种格式和系统调用linux和mac下还是有不少区别,很多代码很难调通..目前装了虚拟机,但还是想在mac原生环境下进行,不知道有没有辙。
4830 次点击
所在节点    问与答
4 条回复
xieyudi1990
2015-02-16 17:44:29 +08:00
编译个gcc, 里边有个as, 用的就是AT&T语法.

最不能接受的就是 源操作数在左 目标在游的AT&T语法, 我只是在gcc内联时用用. 平时统一用yasm/nasm做x86汇编器.
hilojack
2015-03-05 17:41:36 +08:00
@xieyudi1990 mac 下的as 好像还不是标准的AT&T 语法?比如`.section .text` 不行,必须加逗号,`.section .text,`
即使这样,mac 下的很多代码还是跑不通,比如`int $0x80` 只能用linux/i386 架构上,在mac 下不能跑通的。
hilojack
2015-03-05 17:53:40 +08:00
fix,不是因为`int $0x80`只能用于linux, 而是因为'movl $1,%eax' 中的1 是linux 的系统_exit()调用号, 所以在mac 上跑不通. 我觉得, 如果你的`AT&T` 语法的汇编代码大多基于linux,还是用linux 虚拟机为好。不知道楼主是否是我这种情况
xieyudi1990
2015-03-10 05:11:53 +08:00
@hilojack 如果是用GNU的as的话不是可以加参数来改语法的吗? 我刚刚看了下:
[yudi@MBP112 ~]$as --help | grep -i intel
-mmnemonic=[att|intel] use AT&T/Intel mnemonic
-msyntax=[att|intel] use AT&T/Intel syntax

不过的确有很多Linux代码, 特别是那些内联的, 用的是AT&T语法.

不过我一般都是用NASM/YASM写x86汇编, 这个语法我比较喜欢.

我一般都是用汇编干脏活, 给C调用. 按照ABI的规则, 然后global导出符号, 然后汇编成ELF的目标文件.o; C那边写个对应的头文件, 然后直接链接就好了.

好像这个方法目前是主流, 我看到像ffmpeg等工程所有的汇编代码都是用YASM汇编的 (应该也有直接用GNU的, 不过应该只在内联时用下).

===========================
要是直接用汇编在操作系统下写程序, 那你得遵守操作系统的系统调用规则. 每个操作系统的接口都不一样, windows下要调用msvcrt帮你弄 (或者更直接点调用api, 应该也是软trap的, 保护模式下系统调用需要提权), linux下应该也是直接用int来软trap... mac下我不知道, 不过应该也差不多哦, 参考他们的文档.

学x86汇编还算建议弄个带调试功能的模拟器, 直接写裸机程序跑, 那样比较不错. 比如bochs, qemu这种.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/171284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX