使用 GCC 和 GDB 写纯 32 位以及 64 位汇编(AT&T 风格)

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值