汇编语言学习(Assembly Language-8086)

利用闲暇时间学习了小码哥的汇编课程,平时能用到的不多,做个笔记记录一下

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 将函数返回地址出栈,执行下一条指令
  • 恢复栈平衡

版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容