【汇编语言与计算机系统结构笔记05】汇编的系统结构,从C代码生产汇编代码,一个具体的、经典的数据传送指令(mov)实例与分析
2021/6/22 17:29:33
本文主要是介绍【汇编语言与计算机系统结构笔记05】汇编的系统结构,从C代码生产汇编代码,一个具体的、经典的数据传送指令(mov)实例与分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本次笔记内容:
06.寻址模式与数据传输指令等
文章目录
- 汇编程序员眼中的系统结构
- 如何从C代码生产汇编代码
- 如何装gcc?
- 汇编语言数据格式
- 第一条汇编指令实例
- 数据传送指令(mov)
- 语法与操作数类型
- 不同的操作数类型组合
- 简单的寻址模式
- 间接寻址
- 基址+偏移量寻址
- 寻址模式使用实例
- 变址寻址
本次笔记从C语言的经典代码出发,学习汇编语言的接口作业。
汇编程序员眼中的系统结构
在用户层编写程序(不涉及kernel,因此也不涉及保护模式等),x86系统看起来是下述结构:
- CPU是由PC、Registers、Condition Codes构成:
-
- 指令集存器(PC Program Counter),存储下一条指令的地址,在x86-32中用EIP表示,在x86-64中用RIP表示;
-
- 寄存器堆;
-
- 条件码,用于存储最近执行指令的结果状态信息,用于条件跳转指令的判断。
- 存储器(Memory),即存储器,包括Object Code、Program Data、OS Data、Stack:
-
- 以字节编码的连续存储空间;
-
- 存放程序代码、数据、运行栈以及操作系统数据。
CPU为Memory提供指令,Memory将Data和Instructions传输给CPU。
如何从C代码生产汇编代码
C代码
int sum(int x, int y) { int t = x + y; return t; }
命令行输入:
gcc -O2 -S code.c
- -O2表示优化,等级为2(-O3太激进);
- -S表示生产汇编文件;
- 生产汇编文件code.s。
对应的x86-32汇编,AT&T汇编格式(与Intel Microsoft汇编格式不同):
sum: pushl %ebp movl %esp, %ebp movl 12(%ebp), %eax addl 8(%ebp), %eax movl %ebp, %esp popl %ebp ret
如何装gcc?
- linux自带;
- Windows可以去下载Cygwin(Get that Linux feeling on Windows)。
汇编语言数据格式
C声明 | Intel数据类型 | 汇编代码后缀 | 大小(字节) |
---|---|---|---|
char | 字节 | b | 1 |
short | 字 | w | 2 |
int | 双字 | l | 4 |
long int | 双字 | l | 4 |
long long int | - | - | 4 |
char * | 双字 | l | 4 |
float | 单精度 | s | 4 |
double | 双精度 | l | 8 |
long double | 扩展精度 | t | 10/12 |
b即byte,w即word;因为是32位机型,long int与int同,long long int没有。
在x86-32中,使用“字(word)”来表示16位整数类型,“双字”表示32位。汇编语言中没有数据类型,一般采用汇编指令的后缀来进行区分。
第一条汇编指令实例
C代码:
int t = x + y;
为两个整数(32位)相加。
汇编代码:
addl 8(%ebp), %eax
- 两个32位整数相加:
-
- “l”后缀表示是双字运算;
-
- 无符号/带符号整数加法运算的指令是一样的。
类似于表达式 x += y或者:
int eax; int *ebp; eax += ebp[2];
操作数:
- x:Register eax
- y:Memory M[ebp+8];
- t:Register eax
把x与y加起来,放在t中(结果存于eax中)。
机器码:
0x401046: 03 45 08
3-字节指令。
数据传送指令(mov)
语法与操作数类型
数据传送(AT&T语法)
movl Source, Dest:
- 将一个“双字”从Source移到Dest;
- 常见指令。
要注意,对于很多指令,在MIPS或Intel Microsoft中Soure, Dest位置是相反的。
允许的操作数类型
- 立即数:常整数
-
- 如:$0x400, $-533
-
- 应注意一定要有$符号
-
- 可以被1,2或4个字节来表示
- 寄存器:8个通用寄存器之一
- 存储器:四个连续字节,支持多种访存寻址模式
不同的操作数类型组合
Source Dest 例子 类似的C语言表示 movl { Imm { Reg movl $0x4, %eax temp = 0x4; Mem movl $-147, (%eax) *p = -147; } Reg { Reg movl %eax, %edx temp2 = temp1; Mem movl %eax, (%edx) *p = temp; } Mem { Reg movl (%eax), %edx temp = *p; } }
注意:
- 带不带括号意思不同;
- movl $-147, (%eax)表示eax中的值作为地址,把-147这个值放到eax的值所代表的地址的地址空间中去;
- 如果没有美元符号,则把数字当成地址;
- 不能两个操作数都为内存地址!
简单的寻址模式
间接寻址
(R) : Mem[Reg[R]]
表示寄存器R指定内存地址。
movl (%ecx), %eax
基址+偏移量寻址
D(R) : Mem[Reg[R] + D]
- 寄存器R指定内存起始地址;
- 常数D给出偏移量。
movl 8 (%ebp), %edx
表示,取ebp的值,加上8,作为地址,取出连续4个byte来(因为mov后缀为l),放在edx中。
寻址模式使用实例
void swap (int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; }
swap:
pushl %ebp movl %esp, %ebp pushl %ebx // 以上为Set Up movl 12(%ebp), %ecx movl 8(%ebp), %edx movl (%ecx), %eax movl (%edx), %ebx movl %eax, (%edx) movl %ebx, (%ecx) // 以上为Body movl -4(%ebp), %ebx movl %ebp, %esp popl %ebp ret // Finsih
如上图,以ebp作为基准。
如上图,假设现在已知ebp存储0x104:
- 第一条,ebp作为基址(0x104),加12偏移量,即0x110(注意是16进制)的值0x120取出来,并将0x120值赋给exc;
- 第二条,将ebp作为基址,加8偏移量,即0x10c的值0x120取出来,并将其赋给edx;
- 第三条,即将exc的值作为地址,将地址对应的值取出来,赋给%eax;
- 之后同理。
心得:movl (%ecx), %eax表示将ecx的值作为地址,并将其地址对应的值取出来,赋给eax;即,movl其实是对两个地址对应的数值(可是立即数、可是地址)进行操作。
变址寻址
常见形式:
D(Rb, Ri, S) : Mem[Reg[Rb] + S * Reg[Ri]]
- D为常量(地址偏移量);
- Rb为基址寄存器:8个通用寄存器其之一;
- Ri为索引寄存器:%esp不作为索引寄存器,一般%ebp也不做这个用途;
- S为比较因子1,2,3或8.
其他变形还有:
(Rb, Ri) : Mem[Reg[Rb] + Reg[Ri]] D(Rb, Ri) : Mem[Reg[Rb] + Reg[Ri] + D] (Rb, Ri, S) : Mem[Reg[Rb] + S * Reg[Ri]]
这篇关于【汇编语言与计算机系统结构笔记05】汇编的系统结构,从C代码生产汇编代码,一个具体的、经典的数据传送指令(mov)实例与分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享