[Asm]汇编语言(第三版)-笔记

汇编语言<第三版> 王爽 - 笔记

简介

编程的平台是硬件不是操作系统.
汇编语言是直接在硬件之上工作的编程语言.

基础知识

操作:寄存器BX的内容发送到AX中
指令:mov ax,bx
寄存器,简单来讲是CPU中可以存储数据的器件,一个CPU有多个寄存器.
AX只是其中一个寄存器的代号.
BX是另一个寄存器的代号.

汇编指令
机器码的助记符,有对应的机器码.
伪指令
没有对应的机器码,有编译器执行,计算器并不执行.
其他符号
+,-,/,*等,由编译器识别,没有对应的机器码.

存储器

CPU是计算机的核心部件,想要CPU工作就应该对它提供指令和数据。
指令和数据在存储器中存放,也就是内存.
指令和数据
在内存和硬盘上,指令和数据没有区别,都是二进制数据.
cpu在工作的时候把有的信息当做指令,有的信息当做数据.

存储单元

存储器被划分成若干个存储单元,每一个存储单位从0开始顺序编号,例如一个存储器有128个存储单元,它的编号就是0~127.
一个二进制位等于1bit.
8bit == 1byte(字节).
一个存储单元可以存储1byte(8bit)
一个存储器有128个存储单元就可以存储128个byte.

CPU对存储器的读写

存储单元的编号可以看做存储单元在存储器中的地址.
CPU要从内存中读取数据,首先要指定存储单元的地址.
CPU在读写数据时还要指定对哪个部件进行操作,进行哪种操作,是从中读取数据,还是向里面写入数据.
如果CPU要进行数据读写,必须和外部芯片进行3大类信息的交互.

  • 存储单元地址(信息)
  • 器件(芯片)的选择,读或写的命令(控制信息)
  • 读或写的数据(数据信息)
    CPU是通过地址总线,控制总线以及数据总线传送数据到存储器的芯片中.
地址线 3
数据线 8
控制线 读写命令
CPU
内存
  1. CPU通过地址线将地址信息3发出.

  2. CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据.

  3. 存储器将3号单元中的数据8通过数据线送入CPU.

写操作与读操作类似,比如向3号单元写入数据26

CPU通过地址线将地址信息3发出.通过控制线发出内存写命令,选中存储器芯片并通知它要写入数据.

CPU通过数据线把数据26写入内存3号单元中.

汇编命令:mov AX,[3] 把3号单元的内容传入AX

地址总线

CPU通过地址总线来指定存储器单元.地址总线上能传送多少不同的信息,CPU就可以对多少个存储单元进行寻址.

假设一个CPU有10根地址总线.在电子计算机中一根导线有两种状态,高电平或低电平.

用二进制表示就是10,10根导线就可以传送10位二进制数据

假如CPU有N根地址总线.那么这个CPU的地址总线宽度为N.这样CPU最多可以寻找2的N次方个内存单元.

数据总线

CPU与内存或其他器件之间的数据传送是通过数据总线来进行的,数据总线的宽度决定了CPU和外界的数据传送速度.

8根数据总线一次可以传送一个8位(1字节)的二进制数据.16根数据总线一次可传送2个字节.

8088CPU的数据总线宽度为8,8086CPU的数据总线宽度为16
案例:向8088CPU内存中写入数据89D8H

第一次传送D8
8088 CPU
数据总线 1101 1000
内存
第二次传送89
8088 CPU
数据总线 1000 1001
内存

案例:向8086CPU内存中写入数据89D8H

8086CPU
8086 CPU
数据总线 1000 1001 1101 1000
内存

8086有16根数据总线,可一次传送16位数据.

8088有8根数据总线,一次只能传送8位数据,所以进行二次数据传送.

控制总线

CPU对外部器件的控制是通过控制总线来进行的.

有多少根控制总线就意味着CPU提供对外部器件的多少种控制,所以控制总线宽度决定了CPU对外部器件的控制能力。

内存读命令是由一根为读信号输出的控制线由CPU向外传送读信号.CPU向该控制线上输出低电平时表示将要读取数据

内存写命令是由一根为写信号输出的控制线则负责传送写信号.

小结

  • 汇编指令是机器指令的助记符,同机器指令一一对应.
  • 每一种CPU都有自己的汇编指令集.
  • CPU可以直接使用的信息在存储器中存放.
  • 在存储器中的指令和数据没任何区别,都是二进制数据.
  • 存储单元从零开始编号.
  • 一个存储单元可以存储8个bit,即8 为二进制数.
  • 1Byte = 8bit 1KB = 1024byte 1MB = 1024KB 1G = 1024MB
  • 地址总线的宽度决定了CPU的寻址能力.
  • 数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量。
  • 控制总线的宽度决定了CPU对系统中其他器件的控制能力.

检查点

  1. 1个CPU的寻址能力为8KB,那么它的地址总线宽度为13
  • 8KB = 1024B * 8 = 8192
  • 8192 / 2 = 2^N = 13
  1. 1KB的存储器有1024个存储单元,存储单元编号从01023
  • 一个存储单元占1byte(8bit) 1KB = 1024byte
  1. 1KB的存储器可以存储8192bit,1024 个byte.
  • 1KB = 1024byte 1byte = 8bit.
  • 1024byte * 8bit = 8192
  • 一个存储单元占1byte(8bit) 1KB = 1024byte
  1. 1GB,1MB,1KB分别是 1073741824,1048576,1024byte
  • 1GB = 2^30,1MB = 2^20,1KB = 2^10
  1. 8080,8088,80286,80386的地址总宽度分别为16根,20根,24根,32根,则它们的寻址能力分别为 64KB,1MB,16MB,4GB
  2. 8080,8088,8086,80286,80386的数据总宽度分别为8根,8根,16根,16根,32根,则它们一次可以传送的数据为1Byte,1Byte,2Byte,2Byte,4Byte
  3. 从内存中读取1024字节的数据,8086至少要读512次,80386要读256次.
  4. 在存储器中,数据和程序以二进制形式存放.
内存地址空间

一个CPU的地址总线宽度为10,那么可以寻址1024个内存单元.这1024个内存单元就构成了这个CPU的内存地址空间.

主板

主板上有核心器件和一些主要器件,这些器件通过总线(地址,数据,控制总线)相连,这些器件有CPU,存储器,外围芯片组,扩展插槽等.扩展插槽上一般插有RAM内存条和各类接口卡.

接口卡

计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制,CPU对外部设备不能直接控制,如显示器,音箱,打印机等.直接控制这些设备进行工作的是插在扩展插槽上的接口卡.扩展插槽通过总线和CPU相连,所以接口卡也通过总线同CPU相连,CPU可用直接控制这些接口卡,从而实现CPU对外设的间接控制.简单来讲就是CPU通过总线向接口卡发送命令,接口卡根据CPU的命令控制外设进行工作.

各类存储器芯片

随机存储器(RAM)

  • 可读可写,但必须带电存储
  • 关机后存储的内容丢失.
  • 用于存放供CPU使用的绝大部分数据和程序.
  • 主随机存储器一般有两个位置上的RAM组成,装在主板上的RAM和插在扩展槽上的RAM.
  • 接口卡上的RAM

某些接口卡需要对大批输入,输出数据进行暂时存储,在其装上RAM.最典型的就是显卡上的RAM(显存).显卡随时将显存中的数据向显示器上输出.换句话说,我们将需要显示的内容写入显存,就会出现在显示器上.

只读存储器(ROM)

  • 只能读取不能写入
  • 关机后其中的内容不丢失.
  • 装有BIOS的ROM

BIOS是由主板和各类接口卡厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出.在主板和某些接口卡上存储相应的BIOS的ROM。例如,主板上的ROM中存着主板的BIOS,显卡的ROM存储着显卡的BIOS,如果网卡上装有BIOS,那其中就可以存储网卡的ROM.

主板
CPU
总线
RAM 主存储器
ROM 装有系统BIOS
RAM 内存条-扩展插槽
扩展插槽
RAM 显存
ROM 装有显卡的BIOS
ROM 装有网卡 BIOS-扩展插槽
内存地址空间

上述的那些存储器,在物理上是独立的器件,但是在以下两点上相同

  • 都和CPU的总线相连
  • CPU对他们进行读或写的时候都通过控制线发出内存读写命令

CPU在操控它们的时候,把它们当内存对待,把它们总看成一个由若干存储单元组成的逻辑存储器,就是我们所说的内存地址空间.

CPU
总线
主存储器地址空间
显存地址空间
显卡BIOS ROM地址空间
网卡BIOS ROM地址空间
系统BIOS ROM地址空间
RAM主存储器
RAM内存条
RAM显存
ROM装有系统BIOS
ROM装有显卡BIOS
ROM装有网卡BIOS

在逻辑图中所有的物理存储器都被看作一个由若干存储单元组成的逻辑存储器。每个物理存储器在这个逻辑存储器占有一个地址段,即一段地址空间.CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据.

假设逻辑图中的内存地址段分配如下

逻辑存储器地址段空间
主随机存储器0~7FFFH32KB
显存8000H~9FFFH8KB
ROMA000H~FFFFH24KB

CPU向内存地址为100H的内存单元中写入数据,这个数据就被写入主随机存储器中.
CPU向内存地址为8000H的内存单元写入数据,这个数据就被写入显存中,然后会被显卡输出到显示器.
CPU向内存地址为C00H的内存单元写入数据的操作是没有结果的,C00H单元中的内容不会改变,实际上就是ROM存储器中的一个单元》

内存地址空间大小受CPU地址总线宽度的限制,8086CPU的地址总线宽度为20,可以传送220个不同的地址信息(大小从0~220 - 1).即可以定位2^20个内存单元.则8086PC的内存地址空间大小为1MB,同理80386CPU的地址总线宽度为32,则内存地址空间最大为4GB;

不同计算机系统的内存地址空间分配情况是不同的,比如我们希望在显示器上输出一条信息,要向显存中写入数据,必须知道显存在地址空间中的地址.

寄存器

CPU由运算器,控制器,寄存器等器件构成,这些器件靠内部总线相连.

总线(地址,数据,控制)相对于CPU内部来说是外部总线.内部总线实现CPU内部各个组件之间的联系,外部总线实现CPU和主板上的联系.

  • 运算器进行信息处理
  • 寄存器进行信息存储
  • 控制器控制各种器件进行工作
  • 内部总线连接各种器件,在它们之间进行数据传送
    CPU中主要的部件是寄存器,寄存器是CPU中程序猿可以用指令读写的部件.通过改变各种寄存器中的内容来实现对CPU的控制

不同的CPU,寄存器的个数,结构是不相同.8086CPU有14个寄存器,每个寄存器有一个名称.

寄存器

AXBXCXDXSIDISPBPIPCSSSDSESPSW

通用寄存器

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

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

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
AX

一个16位的寄存器可以存储16位的数据,数据在寄存器

8086CPU的上一代CPU寄存器是8位的,为了兼容8086CPUAX,BX,CX,DX这4个寄存器都可分为两个可独立使用的8位寄存器

寄存器高位低位
AXAHAL
BXBHBL
CXCHCL
DXDHCL

16位数据寄存器存放情况
7CDE放入AX

AX
0
1
1
1
1
1
0
0
1
1
0
1
1
1
1
0

16位寄存器分为两个8位寄存器存放情况

AH
0
1
1
1
1
1
0
0
AL
1
1
0
1
1
1
1
0

AX的低8位(07)构成AL寄存器,高8位(815)构成AH寄存器.并且它们是独立的寄存器

字在寄存器中的存储

8086CPU可以一次性处理以下两种尺寸的数据

  • 字节 byte: 一个字节由8bit组成,可以存放于8位寄存器中
  • 字 word 一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节

一个字由两个字节组成

一个字可以存在16位寄存器中,它的高位字节和低位字节就存在于这个寄存器的高8位寄存器和低8位寄存器中.

十六进制的一位相当于二进制的四位,如0100 1110 0010 0000 可以表示为4(0100) E(1110) 2(0010) 0(0000)四位六进制数.
一个内存单元可以存放8位数据,CPU中的寄存器又可以存放n个8位数据,也就是说计算机中的数据大多数是由1~N个8位数据构成.

几条汇编指令

汇编指令控制CPU完成的操作用高级语言描述
mov ax,18将18送入寄存器AXAX = 18
add ax,8把AX寄存器中的数值加8AX = AX + 8
mov ax,bx将BX寄存器中的数据送入寄存器AXAX = BX
add ax,bx把AX和BX寄存器中的数值相加结果放入AXAX = AX + BX

检测点2.1

  1. 写出每条汇编指令之后相关寄存器中的值
汇编指令结果
mov ax,62627AX = F4A3
mov ax,31HAX = 31A3
mov al,23HAX=3123
add ax,axAX=6246
mov bx,826CHAX=826C
mov cx,axAX=6246
mov ax,bxAX=826C
add ax,bxAX=04D8
mov al,bhAX=82D8
mov ah,blAX=6CD8
add ah,ahAX=D8D8
add al,6AX=D8DE
add al,alAX=D8DC
mov ax,cxAX=6246
  1. 只能用目前学过的知识,最多用4条汇编指令,计算出24次方
mov ax,2 = 2
add ax,ax = 4
add ax,ax = 8
add ax,ax = 10(16)

物理地址

CPU访问内存单元时,要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,称为物理地址

CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址,在CPU向地址总线发出物理地址之前,必须在内部先形成这个物理地址,不同的CPU可以有不同形成物理地址的方式.

16位结构的CPU

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

8086CPU是16位结构的CPU,在内部能够一次性处理,传输,暂时存储的信息最大长度为16位.

内存单元的地址在送上地址总线之前,必须在CPU中处理,存储,暂时存放.对于16位CPU,能够一次性处理,传输,暂时存储16位的地址.

8086CPU给出物理地址的方法

8086CPU有20位地址总线,可以传送20位地址.达到1MB的寻址能力.

8086CPU又是16位结构,在内部一次性处理,传输,暂时存储的地址为16位.如果将地址从内部简单的发出,那么它只能送出16位的地址.寻址能力只有64KB.

  • 8086采用一种在内部用两个16位地址合成的方法形成一个20位的物理地址.
段地址 16位
偏移地址 16位
20位
20位物理地址
其他部件
地址加法器
物理地址
输入输出控制电路
地址总线
数据总线
控制总线
内存

当8086CPU要读写内存时

  1. CPU的相关部件提供两个16位地址,一个是段地址,另一个是偏移地址.
  2. 段地址偏移地址通过内部总线送入地址加法器的部件
  3. 地址加法器将两个16位地址合成为一个20位的物理地址.
  4. 地址加法器内部总线将20位物理地址送入输入输出控制电路.
  5. 输入输出控制电路将20位物理地址送上地址总线
  6. 20位物理地址被地址总线传送到存储器

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

假如 8086CPU要访问地址为123C8的内存单元.

地址加法器的工作流程如下

段地址
地址加法器:段地址x16+偏移地址
偏移地址
输出物理地址

段地址x16 常用的说法是左移4位,左移4指的是二进制位

左移运算例子,一个数据为2H,二进制就是10B.

左移位数二进制十六进制十进制
010B2H2
1100B4H4
21000B8H8
310000B10H16
4100000B20H32
  1. 一个数据的二进制左移1位,相当于该数据乘以2
  2. 一个数据的二进制左移N位,相当于该数据乘以2的N次方
  3. 段地址x16的运算就是将以二进制形式存放的段地址左移4位0001 0010 0011 0000‬ => 0001 0010 0011 0000‬ 0000

段地址x16+偏移地址=物理地址的本质含义

本质含义:CPU在访问内存单元时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址

比如学校,体育馆,图书馆在一条笔直的单行路上

学校:0米
体育馆:2000米
图书馆:2826米

你要去图书馆,问我那里的地址,有两种图书馆地址

  1. 从学校走2826米到图书馆
  2. 从学校走2000米到体育馆,从体育馆再走826米到图书馆

第一种是直接给出物理地址2826米

第二种方式是用基础地址和偏移地址相加来得到物理地址

如果我们加一点限制条件,比如只能通过纸条来通信,你问我图书馆地址我只能将它写在纸上.

我必须要有一张容纳4位数据的纸条,才能写下2826的数据.

2826

如果我没有4位纸条,仅有2张可以容纳3位数据的纸条,只能用这种方式告诉你2826这个数据

200
826

在第一张纸上写上200(段地址),再在第二种纸上写上826(偏移地址),你得到两张纸后做这样的运算200(段地址)x10+826(偏移地址)=2826(物理地址)

段的概念

内存并没有分段,段的划分来自CPU,8086CPU用基础地址(段地址x16)+偏移地址=物理地址的方式给出内存单元的物理地址.使得我们可以用分段来管理内存。
比如:

  • 地址10000H~100FFH的内存单元组成一个段,该段的起始基础地址为10000H,段地址1000H(基础地址右移4位),大小100H((100FF - 10000)+1)
    将若干个地址连续的内存单元看作一个段,用段地址x16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元.

段地址x16必然是16的倍数,所以一个段的起始地址也一定是16的倍数.偏移地址为16位,16位的寻址能力为64KB,所以这个段的长度最大为64KB.

CPU可以用不同的段地址和偏移地址形成同一个基础地址.

比如CPU要访问21F60单元,则它给出的段地址SA和偏移地址EA满足(SA x 16) + EA = 21F60

SA(21F6) = 21F60 >> 4 --右移4位
段地址范围 = 11F7‬ ~ 21F6
偏移地址范围 = 0 ~ FFFF
21F60 ~ 31F5F‬ --CPU寻址范围 (SA << 4) + FFFF = 最大范围
大小: (31F5F‬ - 21F60) + 1 = 10000H

检测点

  1. 给定段地址为0001H,仅通过变化偏移地址寻址,CPU寻址范围为10~1000F
  2. 有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻找此单元,则SA应满足的条件是最小1001,最大2000

段寄存器

8086寄存器有4个段寄存器,当8086CPU要访问内存时由这4个段寄存器提供内存单元的段地址.

CSDSSSES

CS和IP

CS 和 IP 是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址.

  • CS为代码段寄存器
  • IP为指令指针寄存器

8086CPU 任意时刻,设置CS中的内容为M,IP中的内容为N,8086CPU将从内存M x 16 + n单元开始,读取一条指令并执行

CPU将CS:IP指向的内容当作指令执行

第一章 汇编语言程序设计的实验环境及实验步骤 知识提要: 本章主要进行汇编语言实验环境及实验步骤,涉及到的知识点包括: 1、汇编语言源程序编写好以后, 必须经过下列几个步骤才能在机器上运行: (1) 编辑源程序(生成.ASM文件) (2) 汇编源程序(.ASM → .OBJ) (3) 连接目标程序(.OBJ → .EXE ) (4) 调试可执行程序(使用调试程序Debug调试生成的.EXE文件) (5) 运行程序输出结果。 2、 Windows环境下的汇编语言集成编程环境的使用 实验一 DOS环境下的汇编语言编程环境使用(基础与验证型) 一、实验要求和目的 1、掌握汇编语言程序设计的基本方法和技能; 2、熟练掌握使用全屏幕编辑程序EDIT编辑汇编语言源程序; 3、熟练掌握宏汇编程序MASM的使用; 4、熟练掌握连接程序LINK的使用。 二、软硬件环境 1、硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存; 2、软件环境:装有MASM 5.0、DEBUG、LINK、EDIT、CREF.EXE和EXR2BIN.EXE等应用程序。 三、实验涉及的主要知识单元 1、汇编语言源程序的汇编过程 汇编语言源程序的汇编过程是是利用汇编程序(MASM)对已编辑好的源程序文件(.ASM)进行汇编,将源程序文件中以ASCII码表示的助记符指令逐条翻译成机器码指令,并完成源程序中的伪指令所指出的各种操作,最后可以建立3个文件:扩展名为 .OBJ的目标文件、扩展名为 .LST 的列表文件和扩展名为 .CRF 的交叉索引文件。目标文件是必须建立的,它包含了程序中所有的机器码指令和伪指令指出的各种有关信息,但该文件中的操作数地址还不是内存的绝对地址,只是一个可浮动的相对地址。列表文件(.LST)中包含了源程序的全部信息(包括注释)和汇编后的目标程序,列表文件可以打印输出,可供调试检查用。交叉索引文件(.CRF)是用来了解源程序中各符号的定义和引用情况的。.LST和.CRF两个文件不是必须建立的,可有有无,可以通过汇编时的命令加以选择。 在对源程序文件(ASM文件)汇编时,汇编程序将对ASM文件进行两遍扫描,若程序文件中有语法错误,则结束汇编,汇编程序将指出源程序中存在的错误,这时应返回编辑环境修改源程序中的错误,再经过汇编,直到最后得到无错误的目标程序,即OBJ文件。因此,汇编程序的主要功能可以概括为以下三点: (1) 检查源程序中的语法错误,并给出错误信息;(2) 产生目标程序文件(OBJ文件),并可给出列表文件(.LST文件);(3) 展开宏指令。 汇编程序是系统提供的用于汇编的系统软件,目前常用的汇编程序有Microsoft公司推出的宏汇编程MASM(MACRO ASSEMBLER)和BORLAND公司推出的TASM(TURBO ASSEMBLER)两种。Microsoft公司推出有宏汇编程序MASM和小汇编程序ASM两种,二者的区别在于:MASM有宏处理功能,而ASM没有宏处理功能,因此,MASMASM的功能强大,但MASM需要占据较大的内存空间,当内存空间较小时(如64 KB),只能使用ASM。 2、目标程序的连接过程 汇编后产生的目标程序(OBJ文件)并不是可执行程序文件(EXE文件),还不能直接运行,它必须通过连接程序(LINK)连接成一个可执行程序后才能运行。连接程序进行连接时,其输入有两个部分:一是目标文件(.OBJ),目标文件可以是一个也可以是多个,可以是汇编语言经汇编后产生的目标文件,也可以是高级语言(例如C语言)经编译后产生的目标文件;另一是库文件(.LIB),库文件是系统中已经建立的,主要是为高级语言提供的。连接后输出两个文件,一是扩展名为 .EXE的可执行文件,另一个是扩展名为 .MAP 的内存分配文件,它是连接程序的列表文件,又称为连接映像(Link Map),它给出每个段在存储器中的分配情况,该文件可有可无。连接程序给出的“无堆栈段的警告性错误”并不影响程序的运行。所以,到此为止,连接过程已经结束,可以在操作系统下执行该.EXE程序了。 3、汇编语言和DOS操作系统的接口 编写的汇编语言源程序是在DOS环境下运行时,必须了解汇编语言是如何同DOS操作系统接口的。 用编辑程序把源程序输入到机器中,用汇编程序把它转换为目标程序,用连接程序对其进行连接和定位时,操作系统为每一个用户程序建立了一个程序段前缀区PSP,其长度为256个字节,主要用于存放所要执行程序的有关信息,同时也提供了程序和操作系统的接口。操作系统在程序段前缀的开始处(偏移地址0000H)安排了一条INT 20H软中断指令。INT 20H中断服务程序由DOS提供,执行该服务程序后,控制就转移到DOS,即返回到DOS管理的状态。因此,用户在组织程序时,必须使程序执行完后能去执行存放于PSP开始处的INT 20H指令,这样便返回到DOS,否则就无法继续键入命令和程序。 DOS在建立了程序段前缀区PSP之后,将要执行的程序从磁盘装入内存。在定位程序时,DOS将代码段置于PSP下方,代码段之后是数据段,最后放置堆栈段。内存分配好之后,DOS就设置段寄存器DS和ES的值,以使它们指向PSP的开始处,即INT 20H的存放地址,同时将CS设置为PSP后面代码段的段地址,IP设置为指向代码段中第一条要执行的指令位置,把SS设置为指向堆栈的段地址,让SP指向堆栈段的栈底,然后系统开始执行用户程序。为了保证用户程序执行完后能返回到DOS状态,可使用如下两种方法。 (一)标准方法 首先将用户程序的主程序定义成一个FAR过程,其最后一条指令为RET。然后在代码段的主程序(即FAR过程)的开始部分用如下三条指令将PSP中INT 20H 指令的段地址及偏移地址压入堆栈: PUSH DS ;保护PSP段地址 MOV AX,0 ;保护偏移地址0 PUSH AX 这样,当程序执行到主程序的最后一条指令RET时,由于该过程具有FAR属性,故存在堆栈内的两个字就分别弹出到CS和IP,从而执行INT 20H指令,使控制返回到DOS状态。返回DOS的标志就是程序运行完后出现一个DOS的标识符,如C:\>。 (二)非标准方法 也可在用户的程序中不定义过程段,只在代码段结束之前(即CODE ENDS之前)增加两条语句: MOV AH,4CH INT 21H 则程序执行完后也会自动返回DOS状态。 此外,由于开始执行用户程序时,DS并不设置在用户的数据段的起始处,ES同样也不设置在用户的附加段起始处,因而在程序开始处使用以下方法重新装填DS和ES的值使其指向用户的数据段: MOV AX,段名 MOV 段寄存器名,AX ;段寄存器名可以是DS、ES、SS之一 四、实验内容与步骤 1、实验内容 编写程序,判断一个年份是否是闰年。 2、实验步骤 汇编语言程序设计上机过程如图1.1所示。 图1.1 汇编语言程序上机过程 (一)用编辑程序EDIT建立汇编语言源程序文件(ASM文件) 例如,编写程序,判断一个年份是否是闰年的汇编语言源程序,可以在DOS模式下用编辑程序EDIT.EXE建立汇编语言源程序文件ABC.ASM,注意文件名的扩展名必须是.ASM。也可以在Windows 2000或者在Windows XP环境下鼠标单击“开始”→“运行”,在“运行”中输入“CMD”进入DOS模式,运行EDIT软件,例如: C> EDIT ABC.ASM 进入EDIT的程序编辑画面时,输入汇编语言源程序如下: DATA SEGMENT INFON DB 0DH,0AH,'Please input a year: $' Y DB 0DH,0AH,'This is a leap year! $' N DB 0DH,0AH,'This is not a leap year! $' W DW 0 BUF DB 8 DB ? DB 8 DUP(?) DATA ENDS STACK SEGMENT 'stack' DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX LEA DX,INFON MOV AH,9 INT 21H LEA DX,BUF MOV AH,10 INT 21H MOV CL, [BUF+1] LEA DI,BUF+2 CALL DATACATE CALL IFYEARS JC A1 LEA DX,N MOV AH,9 INT 21H JMP EXIT A1: LEA DX,Y MOV AH,9 INT 21H EXIT: MOV AH,4CH INT 21H DATACATE PROC NEAR LEA SI,BUF+2 MOV BX,0 X3: MOV AL ,[SI] SUB AL ,30H MOV AH,0 XCHG AX,BX MOV DX,10D MUL DX XCHG AX,BX ADD BX,AX INC SI LOOP X3 MOV W,BX RET DATACATE ENDP IFYEARS PROC NEAR PUSH BX PUSH CX PUSH DX MOV AX,W MOV CX,AX MOV DX,0 MOV BX,4 DIV BX CMP DX,0 JNZ LAB1 MOV AX,CX MOV BX,100 DIV BX CMP DX,0 JNZ LAB2 MOV AX,CX MOV BX,400 DIV BX CMP DX,0 JZ LAB2 LAB1: CLC JMP LAB3 LAB2: STC LAB3: POP DX POP CX POP BX RET IFYEARS ENDP CODE ENDS END START (二)用汇编程序MASMASM文件汇编成目标程序文件(OBJ文件) 当源程序建立以后,仍以ABC.ASM程序为例,我们用汇编程序MASM对ABC.ASM源程序文件进行汇编,以便产生机器码的目标程序文件ABC.OBJ,其操作步骤如下: C>MASM ABC Microsoft (R) Macro Assembler Version 5.00 Copyright (C) Microsoft Corp 1981–1985,1987. All rights reserved. Object filename [ABC.OBJ]: Source listing [NUL.LST]:ABC Cross-reference [NUL.CRF]:ABC 50674 + 450574 Bytes symbol space free 0 Warning Errors 0 Severe Errors 由此可知,汇编程序调入后,首先显示版本号,然后出现三个提示行。 第一个提示行为:Object filename [ABC.OBJ]: 这是询问目标程序文件名,方括号内为机器规定的默认的文件名,通常直接按回车键,表示采用默认的文件名(如上所示),这是我们汇编的主要目的。 第二个提示行为: Source listing [NUL.LST]:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值