x32
1.编写一个汇编文件
若不需要包含其他文件(包括库函数的文件),可以使用 .s 或 .S,若需要包含其他文件,必须使用 .S 的命名格式
gcc 64 bit 可用代码(现已发现,此代码仅在 linux 下的 gcc 可用, tmd-gcc 64bit 请用下面 gcc 32 bit 可用代码):
.globl main
main:
nop #空指令
mov $0, %eax #装入寄存器指令
ret #返回 eax 的值
gcc 32 bit 可用代码:
.globl _main
_main:
nop #空指令
mov $0, %eax #装入寄存器指令
ret #返回 eax 的值
这个汇编代码和 Masm 的不同,入口函数必须是 main(使用 32 bit 的 gcc 编译时是 _main),并且必须使用 .globl main 宏指令(使用 32 bit 的 gcc 编译时必须使用 .globl _main 宏指令)让链接器能够识别 main 函数并编译
2.使用 gcc 编译汇编文件
gcc 64 bit
若要得到可调式的程序,必须使用-g 参数,生成可调试的程序。
必须使用 -m32 参数,指定编译为 32 位的程序
若要指定输出的文件名,使用 -o [文件名] 指定输出的可执行程序名。(默认可执行程序名是 a.exe(Windows 下) 或 a.out(Linux 或 MacOS 下))
(建议在 linux 下,Windows 下的 mingw-w64 在以32位的方式编译时总是有问题(应该是缺少某些库文件))
[ 现已找到解决方案,Windows 下使用 tdm-gcc 可以编译 32 位的,也可以编译 64 位的(唯一的缺点,GCC 更新缓慢... mingw-w64 的 gcc 已经是 7.x 版本,tdm-gcc 的 gcc 还是 5.x 的版本) ]
(本来下面大部分截图是 Windows 下用 x64 的程序装作是 x32 的,但是我觉得不能这样误导人,所以删掉换成 linux 下真正的 x32 程序了)
gcc 32 bit
若要得到可调式的程序,必须使用-g 参数,生成可调试的程序。
(Windows 下 mingw 32bit 可以正常使用)
gcc -g [程序名]
3.使用 gdb 进行调试
gdb [程序名]
(若是 tmd-gcc 64bit,使用 gdb32 [程序名] 进行调试)
使用 start 指令,开始程序的运行
使用 ni 指令,进行单步执行
使用 i r [寄存器名],显示相应寄存器的值
使用 quit 退出调试
更多调试指令,请在互联网上查找 gdb 的资料,本文就不赘述了
结束
x64
1.编写一个汇编文件
若不需要包含其他文件(包括库函数的文件),可以使用 .s 或 .S,若需要包含其他文件,必须使用 .S 的命名格式
.globl main
main:
mov $10000, %rax
ret
64位的入口函数一样必须是 main,并且必须使用 .globl main 宏指令让链接器能够识别 main 函数并编译
2.使用 gcc 编译汇编文件
若要得到可调式的程序,必须使用-g 参数
3.使用 gdb 进行调试
gdb [程序名]
使用 start 指令,开始程序的运行
使用 ni 指令,进行单步执行
使用 i r [寄存器名],显示相应寄存器的值
使用 quit 退出调试
更多调试指令,请在互联网上查找 gdb 的资料,本文就不赘述了
结束
[HELP] 有人知道更多关于 gcc 和 gdb 写汇编的书籍和资料吗?(我找了很多,几乎都是 masm 下的资料...)有的话欢迎在评论中留言!
参考链接:
https://stackoverflow.com/questions/17882936/global-main-in-assembly
https://stackoverflow.com/questions/291655/how-can-i-use-gcc-to-compile-x86-assembly-code-on-an-x64-computer
解决了 Windows 下 64bit gcc 无法编译 32 位程序的问题(感谢[早打大打打核战争 ]的回答!):
https://bbs.csdn.net/topics/391866590