汇编语言
总之是计算机系统所使用的一种比较低级的语言,比机器语言稍微高级一点,但也属于底层语言。
写出汇编语言给计算机编译器编译,翻译成机器语言,再由cpu来执行
基础知识
汇编语言的组成
- 汇编指令(机器码的助记符)
- 伪指令(由编译器执行)
- 其他符号(由编译器识别)
核心是汇编指令
- 存储器:CPU是计算机的核心部件,我们需要提供指令和数据给它,然后指令和数据就在存储器中存放,也就是内存。
在内存或者磁盘上,指令和数据没有区别,都是由二进制书写。
如100100111011000 89D8H(数据)四位数一读,12进制
10010011101100 MOV AX,BX(指令)
- 存储单位:存储器被划分为若干个存储单元,每个单元从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
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