汇编语言

绪论

机器语言是机器指令的集合
机器指令是一台机器可以正确执行的命令,由一串二进制数表示,例 01010000
汇编语言的主体是汇编指令
汇编指令和机器指令的差别在于指令的表示方法上,汇编指令是机器指令便于记忆的书写格式,汇编指令是机器指令的助记符

OEgqvd.png

计算机中的数据和指令,存储在内存或磁盘上
存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号

OERCo6.png

OER1fS.png

OEWS1g.png

OEWggg.png

内存地址空间
; CPU地址总线宽度为N,寻址空间为2^N B
; 8086CPU的地址总线宽度为20,那么可以寻址1MB个内存单元,其内存地址空间为1MB

OEhGlD.png

mount c d:\dosbox\masm
c:

访问寄存器和内存

OE5yZj.png

OEIKTs.png

OEI0t1.png

OEIfAA.png

OExV1J.png

OEzYPU.png

OVSedx.png

物理地址=段地址×16+偏移地址
内存并没有分段,段的划分来自于CPU

OVpv5V.png

输入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指向的内容当作指令执行

OVZirT.png

8086PC工作过程的简要描述:
(1)从CS:IP指向内存单元读取
指令,读取的指令进入指
令缓冲器;
(2)IP = IP + 所读取指令的长
度,从而指向下一条指令;
(3)执行指令。 转到步骤
(1),重复这个过程。

O8I6l8.png

O8IfTs.png

O8IbXF.pngO8Ixt1.png

O8oZtI.png

O8oGAs.png

O8o0uF.pngO8oDHJ.png

O8osE9.png

O8oWjO.png

汇编语言程序

O8TpUs.png

O8T1xK.png

O8Tqo9.png

O87MwQ.png

O1zN4g.png

masm xxx.sam    ;编译生成obj
list xxx        ;连接生成exe

O8jY4g.png

O8jxqP.png

O8vlRJ.png

O8vgdf.png

O8zY4O.pngO8zU8e.png

O8zTaV.png

这里我们的loop s
在debug中看到的其实就是 loop 地址,这里是地址是直接指向我们add dx,ax的地址

OGipCV.png

问题:计算ffff:0~ffff:b字节单元中的数据的和,结果存储在dx中

对策:取出8位数据,加到16位的寄存器
mov al, ds:[addr]
mov ah, 0
add dx, ax

OGFhfP.pngOGFIl8.png

OGkdBQ.png

OGA3b4.png

OGEpdJ.png

内存寻址方式

就是说当我们用逻辑与 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目标变址寄存器

OJUrtA.png

这里bx bp都可以作基址寄存器

OJat4s.png

OJaL8I.png

OJwf0O.png

OJ02Cj.pngOJ0R8s.png

OJ0xr6.png

OJ0zqK.png

流程转移和子程序

OJDoh4.png

OJ2UPK.pngOJ2Drd.png

Ot4tjf.png

汇编语言 = 汇编指令(机器码的助记符) + 伪指令(编译器执行)+ 其他符号(编译器识别)

想要一个cpu运作,那么必须提供指令和数据,而指令和数据放在存储器,内存是主要的存储器

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

cpu和外部交流三部分:

  1. 存地址信息:存储单元的地址
  2. 控制信息:读或写命令
  3. 数据信息:读或写数据

同样就有三种总线

H1aiPs.png

H1dpy6.png

寄存器

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采用小端模式:高地址存放高位字节,低地址存放低位字节

H1dlTg.png

通用寄存器

通用寄存器:通常用来存放一般性的数据,有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位的物理地址。

H10hJH.png

地址加法器采用物理地址 = 段地址×16 + 偏移地址的方法用段地址和偏移地址合成物理地址

例如,8086CPU要访问地址为123C8H的内存单元,1230H左移一位(空出4位)加上00C8H合成123C8H

H1cuXd.png

基础地址+偏移地址=物理地址

段寄存器

段寄存器:8086CPU有4个段寄存器:CS、DS、SS、ES,提供内存单元的段地址。

CS为代码段寄存器,IP为指令指针寄存器,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,CPU将CS:IP指向的内容当作指令执行。(即PC)

H1WJVs.png

8086CPU的工作过程简要描述

  1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
  2. IP=IP+所读取指令的长度,从而指向下一条指令;
  3. 执行指令。转到步骤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硬件设计

results matching ""

    No results matching ""