利用闲暇时间学习了小码哥的汇编课程,平时能用到的不多,做个笔记记录一下
1.与机器语言一一对应,可相互编译反编译
2.一般不能反编译出高级语言
3.不区分大小写
地址合成
段地址:1200H
偏移地址::1000H
物理地址:段地址16+偏移地址=1200H10H+1000H = 12000H+1000H=13000H(*16就是加个0)
单位:
字节:byte,1个字节由8bit组成,可以存储在8位寄存器中
字:word,1个字由2个字节组成,分别称为高字节和低字节
寄存器
通用寄存器:AX,BX,CX,DX
段寄存器:代码段(Code Segment),数据段(Data Segment),堆栈段(Stack Segment),附加段(Extra Segment)
指针寄存器:指令指针寄存器(IP),栈顶指针寄存器(SP),基指针寄存器(BP)
8086CPU工作过程:
1.从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
2.IP=IP+指令长度,从而指向下一条指令
3.重复1
Jmp
Jmp到 段地址:偏移地址
直接jmp到 偏移地址
注释:
;
大小端
大端模式,指数据的高字节保存在内存的低地址中,数据的低字节保存在内存的高地址中
数据段DS
全局变量的地址在编译的时候就已经确认了,偏移地址固定,作为数据段的段地址,mov ax,[address]就是取出DS:address的内存数据放到ax寄存器中
代码段CS
作为代码段的段地址,将CS:IP指向的指令作为下一条需要取出执行的指令,存放程序员写的代码
栈段SS
作为栈段的段地址,任意时刻,SS:SP指向栈顶元素,局部变量,push入栈,写入数据,栈指针下移,pop出栈,数据赋值,栈指针上移,push入栈和pop出栈,出栈入栈都是两个字节
栈平衡
定义:函数调用前后的栈顶指针要一致,若不平衡,栈空间将会用完,如死循环
栈平衡方法:
1.外平栈(add sp +参数)
2.内平栈(ret 参数)
函数调用流程
- push参数
- push函数返回值
- push bp,保留bp
- mov bp,sp保留sp
- sub sp,开辟局部变量
- 保护可能会用到的寄存器
- rep stosw使用CC填充局部空间
- 执行业务逻辑
- 恢复保护的寄存器
- mov sp,bp恢复sp
- pop bp恢复bp
- ret 将函数返回地址出栈,执行下一条指令
- 恢复栈平衡