汇编语言学习小结

汇编语言是仅次于机器语言的底层语言,学习汇编语言可以让我们更好的理解CPU的工作方式和原理,可以帮我们更好的写好高级语言
我们通常使用的C,C++,C#语言都是基于汇编语言的高级语言。通常这些高级语言在机器中变为可执行文件的时候,都会经历以下几个步骤

  1. 预处理(头文件引入,宏替换,内联函数替换等)
  2. 编译(编译器会对文件进行语法检查)
  3. 汇编(会将上述高级语言转换为汇编语言
    mov,add,sub,jmp等汇编指令和相关的伪指令:定义相关代码段,指令段)
  4. 链接(将程序需要的所有库文件链接起来,让所有的symbol都能够referenced到)

汇编语言中涉及到 CPU如何工作和CPU如何和外部部件进行沟通交换数据(显卡,网卡,键盘),学习了

小甲鱼的相关汇编语言零基础 课程后,讲知识点归纳如下
课程视频地址(youtube都是免费的):https://www.youtube.com/watch?v=JfOO6SFF2t4&index=21&list=PLjriMw8NCUVbKxnRdjbKz1fs2Nx2FXMa4&spfreload=1

CPU如何区分存储单元里面的是数据 还是 指令?

Answer: CPU和外部部件之间有三个通道,数据总线,地址总线,控制总线
1. 数据总线出去的我们认为是数据,
2. 地址总线出去的我们认为是寻址(地址总线的大小决定了寻址大小,一般来说8086有20位地址总线,所有能够寻找到2^20=1 MB 的地址 ,每隔存储单位默认是8个bit)
3. 控制总线出去的我们认为是具体操作(读或者写,控制总线的大小决定了控制能力,可以控制多少个外部器件)

CPU中的寄存器是什么,有什么用?

Answer: CPU中寄存器是最接近于CPU的元器件,速度极快(比一级缓存,二级缓存,内存都要快很多),8086处理器有16个寄存器,这些寄存器中的值往往决定了CPU下一个要执行的指令,或者数据是什么。8086寄存器都是16位寄存器(字的概念由此而来word=2byte)
通用寄存器 AX BX CX DX
bx  ——-> 数据偏移地址的寄存器
cx ——-> loop 循环的次数

mov ax, 1000H
mov ds, ax
mov bx, 0020H
mov ax, [bx]  # 将 1000H:0020H的物理地址的内容送入ax  (ax) = ((ds)*16 + (bx))

段寄存器 CS SS DS ES
指令寄存器IP, 栈寄存器SP
SI DI —>功能和BX相近,用来表示偏移,但是不能拆分两个8位的寄存器来使用

CPU中寄存器中的值怎么赋值?
Answer: 通常来讲我们使用mov 指令来给寄存器赋值
mov ax,2 # 将 2, 二进制 0000000000000010赋值给ax通用寄存器
mov cs,ax # 将ax内容复制非指令段寄存器cs中

段寄存器内容不能直接赋值,只能通过通用寄存器来间接赋值,
代码段寄存器 CS : IP 确定下一条指令的物理地址
数据段寄存器 DS: 【offset】确定数据存取的物理地址, offset 通常放在bx寄存器中
栈段寄存器 SS: SP 确定栈顶位置

CPU中寄存器值如何映射到20位地址的物理空间?

Answer: 由于8086的CPU内部总线只有16位(所有寄存器都是一个字,16比特)但是8086外部的地址总线却有20位,如何通过段寄存器和相应的偏移量寄存器来确定物理地址呢?
答案是 段寄存器左移4位,然后相加偏移地址===》 物理地址
CS: IP === 1000H: 0001H =====》 10001H 物理地址
计算机会从10001H 的物理地址去获取这个位置上的指令(可能是mov, push, pop, sub, add)然后执行,执行完毕后,IP寄存器会自动加上相关指令的字节数(mov 3 个字节,IP = IP +3)然后再从 10004H的物理地址上去获取下一个指令。

CPU中栈用来做什么?

CPU中SS:SP确定栈顶位置,每次push 或者pop指令时,都会移动相应的栈顶位置。
push—》 栈顶位置 SP = SP -2, 放入数据(字)
pop —-> 从SP所指位置读取数据(字),SP =SP +2
通常我们程序中函数调用的时候就会涉及到压栈操作,将函数所用的参数从右到左依次压栈,函数指针压栈,函数中的局部变量压栈,函数执行完毕后,再出栈(反方向),局部变量最先出栈。调用这个函数的地方又回到了之前调用前的上下文(寄存器值又恢复到了之前)

loop 如何执行,【cx】

例如我们需要做2^12的计算
分析: 2^12 = 2*2*【11次】*2
loop会先将cx-1,判断如果不为零,则调到相关代码

assume cs:code

code segment
    move ax,2
    mova cx,11
 s: add ax, ax
    loop s

    move ax,4c00H
    int 21h
code ends

end

你可能感兴趣的:(个人亲测)