��վ�ܷ�������

汇编语言学习笔记

汇编语言

总之是计算机系统所使用的一种比较低级的语言,比机器语言稍微高级一点,但也属于底层语言。

写出汇编语言给计算机编译器编译,翻译成机器语言,再由cpu来执行

基础知识

汇编语言的组成

  • 汇编指令(机器码的助记符)
  • 伪指令(由编译器执行)
  • 其他符号(由编译器识别)

核心是汇编指令

  1. 存储器:CPU是计算机的核心部件,我们需要提供指令和数据给它,然后指令和数据就在存储器中存放,也就是内存。

在内存或者磁盘上,指令和数据没有区别,都是由二进制书写。

如100100111011000 89D8H(数据)四位数一读,12进制

10010011101100 MOV AX,BX(指令)

  1. 存储单位:存储器被划分为若干个存储单元,每个单元从0开始顺序编号。

单位换算:

1kb=1024b,1mb=1024kb,1gb=1024mb,1tb=1024gb

CPU对储存器的读写需要三类信息交互

  • 存储单元的地址(地址信息)
  • 期间的选择,读或写命令(控制信息)
  • 读或写的数据(数据信息)

分别为地址总线,数据总线,控制总线

内存地址空间

主板

主板上有核心器件和一些主要部件,通过三类总线相连接,这些期间有CPU,存储器,外围芯片组,扩展插槽等,扩展插槽上一般有RAM内存条和各类接口卡

接口卡

接口卡通过总线同CPU相连接,CPU可以控制这些接口卡,从而实现CPU对外设的间接控制

存储器芯片分类:随机存储器(RAM),只读存储器(ROM)

  • 随机存储器
  • 装有BIOS的ROM
  • 接口卡上的RAM

内存空间分配

寄存器

8086CPU有14个寄存器,为AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW

8086CPU所有的寄存器都是16位的,可以存放两个字节

AX,BX,CX,DX通常用来存放一般性数据被称为通用寄存器

通用寄存器

最大可以存放2^16(4E20H)左右

8086CPU的AX,BX,CX,DX这4个寄存器都分为两个独立使用的8位寄存器来用:

  • AX可分为AH和AL
  • BX可分为BH和BL
  • CX可分为CH和CL
  • DX可分为DH和DL

AL低8位,AH高8位

自在寄存器中的存储

字节:byte 字:word,一个字由高位字节和低位字节组成

基础指令

汇编指令 控制CPU完成的操作 用高级语言的语法描述
mov ax,18 将18送入AX AX=18
mov ah,78 将78送入AH AH=78
add ax,8 AX中数值加8 AX=AX+8
mov ax,bx BX送入AX AX=BX
add ax,bx AX加BX加后存在AX中 AX=AX+BX

16位结构的CPU

  • 运算器一次最多可以处理16位数据
  • 寄存器最大宽度为16位
  • 寄存器和运算器之间的通路为16位

地址加法器采用物理地址=段地址x16+偏移地址,将两个16位地址合成一个20位的物理地址

每一个内存单元都有自己的物理地址

段寄存器

CS,DS,SS,ES4个

CS储存短地址,IP为偏移地址,经过地址加法器后读取20000H的指令B8 23 01,通过数据总线传给执行控制器,使AX的值变为0123H,之后IP的值自动+3,因为指令长度为3,从此不断读取后面的指令

内存访问

字单元:存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元存放字型数据的高位字节,低地址内存单元存放低位字节。

8086CPU中有一个DS寄存器,用来存放要访问的数据的段地址

mov bx,1000H
mov ds,bx
mov al,[0]

[…]表示一个内存单元,…表示内存单元的偏移地址,1000H表示段地址

由于8086CPU不支持将数据直接送入段寄存器的操作,所以必须先把数据传给一个寄存器,再把这个数据传给ds寄存器

更形象理解寄存器

mov ax,1000H
mov ds,ax
mov ax,[0]
mov bx,[2]
mov cx,[1]
add bx,[1]
add cx,[2]

mov,add,sub三种指令的对象既可以是寄存器,数据也可以使内存单元

数据段

RISC-V指令

在RV32中,words为32bit

基础指令

RISC-V 寄存器编号为0-31,其中x0就是0

add x1,x2,x3 #x1=x2+x3
sub x1,x2,x3 #x1=x2-x3
addi x1,x2,-10 #x1=x2-10,有数字的时候用这个
add x1,x2,x0 #x1=x2,x0 is hard-wired to value 0
add x0,x1,x2 #means nothing is No-Op
mv rd,rs #addi rd,rs,0
li rd,13# addi,rd,x0,13

load,store指令

lw x10,12(x15) # Reg x10 gets A[3]
add x10,x13,x10 # a=b+A[3]
sw x10,40(x15) # A[10]=b+A[3]
lb x10,3(x11) # unsigned byte contents of register x11 is copied to the low byte position of register x10.
# 不存在no unsigned store byte sbu

12指代12bytes,12/4=3就是第三位的数,一位4个字节

位运算

对于addi加的数最大值FF000000,

slli x11,x12,2 #x11=x12<<2 2进制中左移2位 srli x11,x12,2#x11="x12">>2
srai x10,x10,4#x10=-25,x10=-2

变量名

a0-a7#变量
t0-t6#临时变量 
s0-s11#

条件

beq register1, register2, L1
#if (value in register1) == (value in register2) go to statement labeled L1
bne register1, register2, L1
#if (value in register1) != (value in register2) go to statement labeled L1
bne x13,x14,Exit #if(i==j)
add x10,x11,x12#a=b+c
Exit:
bne x13,x14,Exit #if(i==j)
add x10,x11,x12#a=b+c
j Exit #else
Else: sub x10,x11,x12 #a=b-c
Exit:
blt reg1,reg2,label
#if reg1=eg2 go to statement label
bgeu reg1,reg2,label
#if reg1>=reg2 go to statement labelunsigned integers

汇编和C对照

先要调用内存,再加减乘除

C语言中内存分配

函数

Unconditional branches (jumps):j, jr

Functions called withjal, return with jr ra

CalleR: the calling function

CalleE: the function being called

关于内存分配

汇编指令的机器编码

6种指令格式

R指令

add rd, rs1, rs2

I指令

imm[11:0]代表12位数字,是需要立即指令的数字叫做immediate

shamtp[]代表位移的位数

addi rd, rs1, imm

Load指令

lw rd , imm (rs1)

S指令

sw rs2, offset (rs1) Imm[11:5]存的是高位,imm[4:0]存的是低位

B指令

U指令

lui rd, u-imm Auipc rd, 0

J指令

j Label = jal x0, Label jal ra, FuncName

JALR指令