汇编语言
绪论
机器语言是机器指令的集合
机器指令是一台机器可以正确执行的命令,由一串二进制数表示,例 01010000
汇编语言的主体是汇编指令
汇编指令和机器指令的差别在于指令的表示方法上,汇编指令是机器指令便于记忆的书写格式,汇编指令是机器指令的助记符
计算机中的数据和指令,存储在内存或磁盘上
存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号
内存地址空间
; CPU地址总线宽度为N,寻址空间为2^N B
; 8086CPU的地址总线宽度为20,那么可以寻址1MB个内存单元,其内存地址空间为1MB
mount c d:\dosbox\masm
c:
访问寄存器和内存
物理地址=段地址×16+偏移地址
内存并没有分段,段的划分来自于CPU
输入debug进入
R - 查看寄存器内容
R 寄存器名
D - 列出预设地址内存处的128个字节的内容
D 段地址:偏移地址
E 段地址:偏移地址 数据1 数据2 ...
E 段地址:偏移地址
例如:e 2000:0000 12 34 56 AB 3F F3
例如:e 2000:0000
12.61 34.41 56.62 AB.F4
U命令将内存中的机器指令翻译成汇编指令
有汇编指令
mov ax, 0123H
mov bx, 0003H
mov ax, bx
add ax, bx
:对应的机器码为
B8 23 01
BB 03 00
89 D8
01 D8
: e 地址 数据 - 写入
: d 地址 - 查看
: u 地址 - 查看代码
a 写入汇编指令 t 执行CS:IP处的指令
a 073f:0100
mov ax, 0123H
mov bx, 0003H
mov ax, bx
add ax, bx
t
q 退出debug
CS:代码段寄存器
IP: 指令指针寄存器
CS:IP:CPU将内存中CS:IP指向的内容当作指令执行
8086PC工作过程的简要描述:
(1)从CS:IP指向内存单元读取
指令,读取的指令进入指
令缓冲器;
(2)IP = IP + 所读取指令的长
度,从而指向下一条指令;
(3)执行指令。 转到步骤
(1),重复这个过程。
汇编语言程序
masm xxx.sam ;编译生成obj
list xxx ;连接生成exe
这里我们的loop s
在debug中看到的其实就是 loop 地址,这里是地址是直接指向我们add dx,ax的地址
问题:计算ffff:0~ffff:b字节单元中的数据的和,结果存储在dx中
对策:取出8位数据,加到16位的寄存器
mov al, ds:[addr]
mov ah, 0
add dx, ax
内存寻址方式
就是说当我们用逻辑与 and 时,and 11011111时,和1与的是原来的数,和0与的一定是0,这样就把小写b变成大写B
反过来,用逻辑或 or 时, or 00100000时,和0或一定是原来的数,和1或一定是1,这样就把大写的B变成了小写的b
几种寄存器复习:
通用寄存器AX,BX,CX,DX 可以看成是两个8位的寄存器构成
指针寄存器:SP 栈顶指针寄存器
指令指针寄存器:IP
段寄存器:CS,SS,DS,ES 这里CS就是代码段寄存器,DS是数据段寄存器,SS是栈段寄存器
变址寄存器:SI,DI SI源变址寄存器,DI目标变址寄存器
这里bx bp都可以作基址寄存器
流程转移和子程序
汇编语言 = 汇编指令(机器码的助记符) + 伪指令(编译器执行)+ 其他符号(编译器识别)
想要一个cpu运作,那么必须提供指令和数据,而指令和数据放在存储器,内存是主要的存储器
存储器被划分为若干存储单元,每个存储单元从0开始顺序编号
cpu和外部交流三部分:
- 存地址信息:存储单元的地址
- 控制信息:读或写命令
- 数据信息:读或写数据
同样就有三种总线
寄存器
cpu内部由:运算器,控制器,寄存器组成
8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW都是16位
- 字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中。
- 字:记为word,一个字由两个字节组成,可以存在一个16位寄存器中(16位CPU)
8086采用小端模式:高地址存放高位字节,低地址存放低位字节
通用寄存器
通用寄存器:通常用来存放一般性的数据,有AX、BX、CX、DX,它们可分为两个可独立使用的8位寄存器,
16位 8高位 8低位 AX AH AL BX BH BL CX CH CL DX DH DL 在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的
一个8位寄存器所能存储的数据范围是0 ~ 2^8-1。
3、8086CPU给出物理地址的方法
8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。 8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。 从8086CPU的内部结构来看,如果将地址从内部简单地发出,那么它只能送出16位的地址,表现出的寻址能力只有64KB。 8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
地址加法器采用物理地址 = 段地址×16 + 偏移地址的方法用段地址和偏移地址合成物理地址
例如,8086CPU要访问地址为123C8H
的内存单元,1230H
左移一位(空出4位)加上00C8H
合成123C8H
基础地址+偏移地址=物理地址
段寄存器
段寄存器:8086CPU有4个段寄存器:CS、DS、SS、ES
,提供内存单元的段地址。
CS为代码段寄存器,IP为指令指针寄存器,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,CPU将CS:IP指向的内容当作指令执行。(即PC)
8086CPU的工作过程简要描述
- 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
- IP=IP+所读取指令的长度,从而指向下一条指令;
- 执行指令。转到步骤1,重复这个过程。
在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。
8086CPU提供转移指令修改CS、IP的内容。
jmp 段地址:偏移地址:用指令中给出的段地址修改CS,偏移地址修改IP。如:jmp 2AE3:3
jmp 某一合法寄存器:仅修改IP的内容。如:jmp ax。在含义上好似:mov IP,ax
8086CPU不支持将数据直接送入段寄存器的操作,这属于8086CPU硬件设计