基本概念
- 机器指令和汇编指令
机器指令:可读性低,一般由二进制01表示
汇编指令:选用一些反应机器指令的功能单词或词组代表机器指令,把CPU内部资源符号化,引用符号=引用具体物理资源。 - 汇编语言格式
指令 源操作数 目的操作数 eg:movl $8, %eax
常用指令
- 编译指令
指令 | 功能 |
---|---|
gedit 1006.s | 编辑.s文件 |
as -g 1006.s -o 1006.o | 将.s文件转化为.o文件 |
ld 1006.o -o 1006 | 将.o文件转化为可执行文件 |
objdump -d 1006 | 查看目标文件 |
- 调试指令
指令 | 功能 |
---|---|
b *_start+1 | 进入调试 |
as -g 1006.s -o 1006.o | 设置断点 |
r(run) | 运行 |
n(next) | 下一步 |
x/4bt 0x12345678 (b单字节、h双字节、w四字节) | 打印地址中的值 |
p value1 | 打印值 |
p &value1 | 打印储存的地址 |
注:上述指令在每个程序编译调试的时候都重复使用,没有什么具体可讲的,只需要记忆熟练,所以先总结在上面。对于具体程序的编译调试,会侧重分析程序中的数据具体流向和操作指令的功能作用。
程序举例
eg:比例变址寻址
-
程序代码
.section .text .global _start _start: nop movl $0x08048056,%ebx movl $2,%ecx movl $0x0402402b,%ecx movw (,%ecx,0x2),%ax movl $1, %eax movl $0, %ebx int $0x80
-
编译及进入调试
-
调试详解
movl $0x08048056,%ebx: 直接寻址,把0x8048056存入%ebx
movl $2,%ecx :直接寻址,把2存入%ecx
movw (%ebx,%ecx,0x2),%ax: 把%ecx中的值乘2加上%ebx中的值的结果作为地址,读出其中对应的4个字节赋值给%ax