1
xieyudi1990 2015-02-16 17:44:29 +08:00 via iPhone
编译个gcc, 里边有个as, 用的就是AT&T语法.
最不能接受的就是 源操作数在左 目标在游的AT&T语法, 我只是在gcc内联时用用. 平时统一用yasm/nasm做x86汇编器. |
2
hilojack 2015-03-05 17:41:36 +08:00
@xieyudi1990 mac 下的as 好像还不是标准的AT&T 语法?比如`.section .text` 不行,必须加逗号,`.section .text,`
即使这样,mac 下的很多代码还是跑不通,比如`int $0x80` 只能用linux/i386 架构上,在mac 下不能跑通的。 |
3
hilojack 2015-03-05 17:53:40 +08:00
fix,不是因为`int $0x80`只能用于linux, 而是因为'movl $1,%eax' 中的1 是linux 的系统_exit()调用号, 所以在mac 上跑不通. 我觉得, 如果你的`AT&T` 语法的汇编代码大多基于linux,还是用linux 虚拟机为好。不知道楼主是否是我这种情况
|
4
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这种. |