汇编语言早已脱离了主流编程语言的行列,可以说现在基本上没有人想用它来完成什么大的项目,但是作为一个程序员懂得汇编语言是一种修养一种底蕴。看不懂汇编的程序员就像不会画鸡蛋的达芬奇,像不会写楷书的王羲之,像不懂TCP/IP的黑客……
本文为后文做铺垫,适合已经有一点汇编基础的人快速浏览阅读,如果没有这个基础请自行学习。汇编语言论风格来分主要是两类,一类是Intel汇编,一类是AT&T汇编,分别被Windows和Linux作为主流风格。因为我博客以推荐Linux系统为主,所以以后多以Linux汇编为主要描述语言。
简单说一下AT&T汇编,"#"井号开头的是注释行,"."点开始的指令一般都是伪指令,"$"美元符号修饰立即数,"%"修饰寄存器。例如:
.section .data
表示数据段的开始
movl $1, %eax
表示把数字1写入eax寄存器。
movl 0xFFFF0000, %ebx
表示把0xFFFF0000地址处的32位数写入ebx寄存器。
寻址方式:
以前经常要背诵的什么基址寻址,变址寻址,基址变址寻址神马的太绕人了,又不好记。 我觉得内存地址的引用就这一种格式:
地址或偏移 (%基址或偏移量寄存器, %索引寄存器, 比例因子)
地址的计算公式是:
最终地址 = 地址或偏移 + %基址或偏移量寄存器 + %索引寄存器 * 比例因子
这一串东西基本上