汇编语言(六)——操作数

 

0.前言

x86 的指令格式为:

[label:] mnemonic [operands][ ;comment ]

指令包含的操作数个数可以是:0 个,1 个,2 个或 3 个。这里,为了清晰起见,省略掉标号和注释:

mnemonic

mnemonic [destination]

mnemonic [destination] , [source]

mnemonic [destination] , [source-1] , [source-2]

操作数有 3 种基本类型:

  • 立即数——用数字文本表达式

  • 寄存器操作数——使用 CPU 内已命名的寄存器

  • 内存操作数——引用内存位置

下表说明了标准操作数类型,它使用了简单的操作数符号(32 位模式下),这些符号来自 Intel 手册并进行了改编。本教程将用这些符号来描述每条指令的语法。

操作数说明
reg88 位通用寄存器:AH、AL、BH、BL、CH、CL、DH、DL
reg1616 位通用寄存器:AX、BX、CX、DX、SI、DI、SP、BP
reg3232 位通用寄存器:EAX、EEX、ECX、EDX、ESI、EDI、ESP、EBP
reg通用寄存器
sreg16 位段寄存器:CS、DS、SS、ES、FS、GS
imm8 位、16 位或 32 位立即数
imm88 位立即数,字节型数值
imm1616 位立即数,字类型数值
imm3232 位立即数,双字型数值
reg/mem88 位操作数,可以是 8 位通用寄存器或内存字节
reg/mem1616 位立即数,可以是 16 位通用寄存器或内存字
reg/mem3232 位立即数,可以是 32 位通用寄存器或内存双字
mem8位、16 位或 32 位内存操作数

变量名引用的是数据段内的偏移量。可以编写指令,通过内存操作数的地址来解析(查找)这些操作数。另一种表示法。一些程序员更喜欢使用下面这种直接操作数的表达方式。因为,括号意味着解析操作。

mov al, [var1]

MASM 允许这种表示法,因此只要愿意就可以在程序中使用。由于多数程序(包括 Microsoft 的程序)印刷时都没有用括号,所以,本书只在出现算术表达式时才使用这种带括号的表示法:

mov al,[var1 + 5]

1.MOV指令

MOV 指令将源操作数复制到目的操作数。作为数据传送(data transfer)指令,它几乎用在所有程序中。在它的基本格式中,第一个操作数是目的操作数,第二个操作数是源操作数:

MOV destination,source

其中,目的操作数的内容会发生改变,而源操作数不会改变。

在几乎所有的汇编语言指令中,左边的操作数是目标操作数,而右边的操作数是源操作数。只要按照如下原则,MOV 指令使用操作数是非常灵活的。

  • 两个操作数必须是同样的大小。
  • 两个操作数不能同时为内存操作数。
  • 指令指针寄存器(IP、EIP 或 RIP)不能作为目标操作数。

单条 MOV 指令不能用于直接将数据从一个内存位置传送到另一个内存位置。相反,在将源操作数的值赋给内存操作数之前,必须先将该数值传送给一个寄存器。在将整型常数复制到一个变量或寄存器时,必须考虑该常量需要的最少字节数。尽管 MOV 指令不能直接将较小的操作数复制到较大的操作数中,但是程序员可以想办法解决这个问题。假设要将 count(无符号,16 位)传送到 ECX(32 位),可以先将 ECX 设置为 0,然后将 count 传送到 CX。

MOVZX 指令(进行全零扩展并传送)将源操作数复制到目的操作数,并把目的操作数 0 扩展到 16 位或 32 位。这条指令只用于无符号整数,有三种不同的形式:

MOVZX reg32,reg/mem8
MOVZX reg32,reg/mem16
MOVZX reg16,reg/mem8

在三种形式中,第一个操作数(寄存器)是目的操作数,第二个操作数是源操作数。注意,源操作数不能是常数。

MOVSX 指令(进行符号扩展并传送)将源操作数内容复制到目的操作数,并把目的操作数符号扩展到 16 位或 32 位。这条指令只用于有符号整数,有三种不同的形式:

MOVSX reg32, reg/mem8
MOVSX reg32, reg/mem16
MOVSX reg16, reg/mem8

操作数进行符号扩展时,在目的操作数的全部扩展位上重复(复制)长度较小操作数的最高位。

1.LAHF指令

LAHF(加载状态标志位到 AH)指令将 EFLAGS 寄存器的低字节复制到 AH。被复制的标志位包括:符号标志位、零标志位、辅助进位标志位、奇偶标志位和进位标志位。使用这条指令,可以方便地把标志位副本保管在变量中。

2.SAHF指令

SAHF(保存 AH 内容到状态标志位)指令将 AH 内容复制到 EFLAGS(或 RFLAGS)寄存器低字节。

3.XCHG指令

XCHG(交换数据)指令交换两个操作数内容。该指令有三种形式:

XCHG reg, reg
XCHG reg, mem
XCHG mem, reg

4.直接偏移量操作数

变量名加上一个位移就形成了一个直接 - 偏移量操作数。这样可以访问那些没有显式标记的内存位置。在 16 位的字数组中,每个数组元素的偏移量比前一个多 2 个字节。同样,如果是双字数组,则第一个元素偏移量加 4 才能指向第二个元素。

5.INC 和 DEC 指令

INC(增加)和DEC(减少)指令分别表示寄存器或内存操作数加 1 和减 1。语法如下所示:

INC reg/mem
DEC reg/mem

根据目标操作数的值,溢岀标志位、符号标志位、零标志位、辅助进位标志位、进位标志位和奇偶标志位会发生变化。INC 和 DEC 指令不会影响进位标志位(这还真让人吃惊)。

6.运算指令

ADD 指令将长度相同的源操作数和目的操作数进行相加操作。语法如下:

ADD dest,source

SUB 指令从目的操作数中减去源操作数。指令语法如下:

SUB dest, source

NEG(非)指令通过把操作数转换为其二进制补码,将操作数的符号取反。下述操作数可以用于该指令:

NEG reg
NEG mem

提示:将目标操作数按位取反再加 1,就可以得到这个数的二进制补码。

标志位:进位标志位、零标志位、符号标志位、溢出标志位、辅助进位标志位和奇偶标 志位根据存入目标操作数的数值进行变化。检查算术运算结果使用的是 CPU 状态标志位的值,同时,这些值还可以触发条件分支指令,即基本的程序逻辑工具。下面是对状态标志位的简要概述:

  • 进位标志位意味着无符号整数溢出。比如,如果指令目的操作数为 8 位,而指令产生的结果大于二进制的 1111 1111,那么进位标志位置 1。
  • 溢出标志位意味着有符号整数溢出。比如,指令目的操作数为 16 位,但其产生的负数结果小于十进制的 -32 768,那么溢出标志位置 1。
  • 零标志位意味着操作结果为 0。比如,如果两个值相等的操作数相减,则零标志位置 1。
  • 符号标志位意味着操作产生的结果为负数。如果目的操作数的最高有效位(MSE)置 1,则符号标志位置 1。
  • 奇偶标志位是指,在一条算术或布尔运算指令执行后,立即判断目的操作数最低有效字节中 1 的个数是否为偶数。
  • 辅助进位标志位置 1,意味着目的操作数最低有效字节中位 3 有进位。

7.OFFSET运算符

OFFSET 运算符返回数据标号的偏移量。这个偏移量按字节计算,表示的是该数据标号距离数据段起始地址的距离。

8.ALIGN伪指令

ALIGN 伪指令将一个变量对齐到字节边界、字边界、双字边界或段落边界。语法如下:

ALIGN bound

9.PTR运算符

PTR 运算符可以用来重写一个已经被声明过的操作数的大小类型。只要试图用不同于汇编器设定的大小属性来访问操作数,那么这个运算符就是必需的。

10.TYPE运算符

TYPE 运算符返回变量单个元素的大小,这个大小是以字节为单位计算的。

11.LENGTHOF运算符

LENGTHOF 运算符计算数组中元素的个数,元素个数是由数组标号同一行出现的数值来定义的。如果数组定义中出现了嵌套的 DUP 运算符,那么 LENGTHOF 返回的是两个数值的乘积。如果数组定义占据了多个程序行,那么 LENGTHOF 只针对第一行定义的数据。

12.LABEL伪指令

LABEL 伪指令可以插入一个标号,并定义它的大小属性,但是不为这个标号分配存储空间。LABEL 中可以使用所有的标准大小属性,如 BYTE、WORD、DWORD、QWORD 或 TBYTE。LABEL 常见的用法是,为数据段中定义的下一个变量提供不同的名称和大小属性。

13.间接寻址

直接寻址很少用于数组处理,因为,用常数偏移量来寻址多个数组元素时,直接寻址不实用。反之,会用寄存器作为指针(称为间接寻址)并控制该寄存器的值。如果一个操作数使用的是间接寻址,就称之为间接操作数。任何一个 32 位通用寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP 和 ESP)加上括号就能构成一个间接操作数。寄存器中存放的是数据的地址。如果目的操作数也是间接操作数,那么新值将存入由寄存器提供地址的内存位置。变址操作数是指,在寄存器上加上常数产生一个有效地址。

如果一个变量包含另一个变量的地址,则该变量称为指针。指针是控制数组和数据结构的重要工具,因为,它包含的地址在运行时是可以修改的。比如,可以使用系统调用来分配(保留)一个内存块,再把这个块的地址保存在一个变量中。

14.JMP和LOOP(转移)指令

汇编语言程序使用条件指令来实现如 IF 语句的高级语句与循环。每条条件指令都包含了一个可能的转向不同内存地址的转移(跳转)。控制转移,或分支,是一种改变语句执行顺序的方法,它有两种基本类型:

  • 无条件转移:无论什么情况都会转移到新地址。新地址加载到指令指针寄存器,使得程序在新地址进行执行。JMP 指令实现这种转移。
  • 条件转移:满足某种条件,则程序出现分支。各种条件转移指令还可以组合起来,形成条件逻辑结构。CPU 基于 ECX 和标志寄存器的内容来解释真 / 假条件。

JMP 指令无条件跳转到目标地址,该地址用代码标号来标识,并被汇编器转换为偏移 量。语法如下所示:

JMP destination

当 CPU 执行一个无条件转移时,目标地址的偏移量被送入指令指针寄存器,从而导致迈从新地址开始继续执行。

LOOP 指令,正式称为按照 ECX 计数器循环,将程序块重复特定次数。ECX 自动成为计数器,每循环一次计数值减 1。语法如下所示:

LOOP destination

循环目标必须距离当前地址计数器 -128 到 +127 字节范围内。LOOP 指令的执行有两个步骤:

  • 第一步,ECX 减 1。
  • 第二步,将 ECX 与 0 比较。

如果 ECX 不等于 0,则跳转到由目标给岀的标号。否则,如果 ECX 等于 0,则不发生跳转,并将控制传递到循环后面的指令。实地址模式中,CX 是 LOOP 指令的默认循环计数器。同时,LOOPD 指令使用 ECX 为循环计数器,LOOPW 指令使用 CX 为循环计数器。

  • 5
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章 计算机系统概述 复习题: 1.1、 列出并简要地定义计算机的四个主要组成部分。 答:主存储器,存储数据和程序;算术逻辑单元,能处理二进制数据;控制单元,解读存储器中的指令并且使他们得到执行;输入/输出设备,由控制单元管理。 1.2、 定义处理器寄存器的两种主要类别。 答:用户可见寄存器:优先使用这些寄存器,可以使机器语言或者汇编语言的程序员减少对主存储器的访问次数。对高级语言而言,由优化编译器负责决定把哪些变量应该分配给主存储器。一些高级语言,如C语言,允许程序言建议编译器把哪些变量保存在寄存器中。 控制和状态寄存器:用以控制处理器的操作,且主要被具有特权的操作系统例程使用,以控制程序的执行。 1.3、 一般而言,一条机器指令能指定的四种不同操作是什么? 答:这些动作分为四类:处理器-寄存器:数据可以从处理器传送到存储器,或者从存储器传送到处理器。处理器-I/O:通过处理器和I/O模块间的数据传送,数据可以输出到外部设备,或者从外部设备输入数据。数据处理,处理器可以执行很多关于数据的算术操作或逻辑操作。控制:某些指令可以改变执行顺序。 1.4、 什么是中断? 答:中断:其他模块(I/O,存储器)中断处理器正常处理过程的机制。 1.5、 多中断的处理方式是什么? 答:处理多中断有两种方法。第一种方法是当正在处理一个中断时,禁止再发生中断。第二种方法是定义中断优先级,允许高优先级的中断打断低优先级的中断处理器的运行。 1.6、 内存层次的各个元素间的特征是什么? 答:存储器的三个重要特性是:价格,容量和访问时间。 1.7、 什么是高速缓冲存储器? 答:高速缓冲存储器是比主存小而快的存储器,用以协调主存跟处理器,作为最近储存地址的缓冲区。 1.8、 列出并简要地定义I/O操作的三种技术。 答:可编程I/O:当处理器正在执行程序并遇到与I/O相关的指令时,它给相应的I/O模块发布命令(用以执行这个指令);在进一步的动作之前,处理器处于繁忙的等待中,直到该操作已经完成。中断驱动I/O:当处理器正在执行程序并遇到与I/O相关的指令时,它给相应的I/O模块发布命令,并继续执行后续指令,直到后者完成,它将被I/O模块中断。如果它对于进程等待I/O的完成来说是不必要的,可能是由于后续指令处于相同的进程中。否则,此进程在中断之前将被挂起,其他工作将被执行。直接存储访问:DMA模块控制主存与I/O模块间的数据交换。处理器向DMA模块发送一个传送数据块的请求,(处理器)只有当整个数据块传送完毕后才会被中断。 1.9、 空间局部性和临时局部性间的区别是什么? 答:空间局部性是指最近被访问的元素的周围的元素在不久的将来可能会被访问。临时局部性(即时间局部性)是指最近被访问的元素在不久的将来可能会被再次访问。 1.10、 开发空间局部性和时间局部性的策略是什么? 答:空间局部性的开发是利用更大的缓冲块并且在存储器控制逻辑中加入预处理机制。时间局部性的开发是利用在高速缓冲存储器中保留最近使用的指令及数据,并且定义缓冲存储的优先级。 习题: 1.1、图1.3中的理想机器还有两条I/O指令: 0011 = 从I/O中载入AC 0111 = 把AC保存到I/O中 在这种情况下,12位地址标识一个特殊的外部设备。请给出以下程序的执行过程(按照图1.4的格式): 1. 从设备5中载入AC。 2. 加上存储器单元940的内容。 3. 把AC保存到设备6中。 假设从设备5中取到的下一个值为3940单元中的值为2。 答案:存储器(16进制内容):300:3005;301:5940;302:7006 步骤1:3005->IR;步骤2:3->AC 步骤3:5940->IR;步骤4:3+2=5->AC 步骤5:7006->IR:步骤6:AC->设备 6 1.2、本章中用6步来描述图1.4中的程序执行情况,请使用MAR和MBR扩充这个描述。 答案:1. a. PC中包含第一条指令的地址300,该指令的内容被送入MAR中。 b. 地址为300的指令的内容(值为十进制数1940)被送入MBR,并且PC增1。这两个步骤是并行完成的。 c. MBR中的值被送入指令寄存器IR中。 2. a. 指令寄存器IR中的地址部分(940)被送入MAR中。 b. 地址940中的值被送入MBR中。 c. MBR中的值被送入AC中。 3. a. PC中的值(301)被送入MAR中。 b. 地址为301的指令的内容(值为十进制数5941)被送入MBR,并且PC增1。 c. MBR中的值被送入指令寄存器IR中。 4. a. 指令寄存器IR中的地址部分(941)被送入MAR中。 b. 地址941中的值被送入MBR中。 c. AC中以前的内容和地址为941的存储单元中的内容相加,结果保存到AC中。 5. a. PC中的值(302)被送入MAR中。 b. 地址为302的指令的内容(值为十进制数2941)被送入MBR,并且PC增1。 c. MBR中的值被送入指令寄存器IR中。 6. a. 指令寄存器IR中的地址部分(941)被送入MAR中。 b. AC中的值被送入MBR中。 c. MBR中的值被存储到地址为941的存储单元之中。 1.4、假设有一个微处理器产生一个16位的地址(例如,假设程序计数器和地址寄存器都是16位)并且具有一个16位的数据总线。 a.如果连接到一个16位存储器上,处理器能够直接访问的最大存储器地址空间为多少? b.如果连接到一个8位存储器上,处理器能够直接访问的最大存储器地址空间为多少? c.处理访问一个独立的I/O空间需要哪些结构特征? d.如果输入指令和输出指令可以表示8位I/O端口号,这个微处理器可以支持多少8位I/O端口? 答案:对于(a)和(b)两种情况,微处理器可以直接访问的最大存储器地址空间为216 = 64K bytes;唯一的区别是8位存储器每次访问传输1个字节,而16位存储器每次访问可以传输一个字节或者一个16位的字。对于(c)情况,特殊的输入和输出指令是必要的,这些指令的执行体会产生特殊的“I/O信号”(有别于“存储器信号”,这些信号由存储器类型指令的执行体产生);在最小状态下,一个附加的输出针脚将用来传输新的信号。对于(d)情况,它支持28 = 256个输入和28 = 256个输出字节端口和相同数目的16位I/O端口;在任一情况, 一个输入和一个输出端口之间的区别是通过被执行的输入输出指令所产生的不同信号来定义的。 1.5、考虑一个32位微处理器,它有一个16位外部数据总线,并由一个8MHz的输入时钟驱动。假设这个微处理器有一个总线周期,其最大持续时间等于4个输入时钟周期。请问该微处理器可以支持的最大数据传送速度为多少?外部数据总线增加到21位,或者外部时钟频率加倍,哪种措施可以更好地提高处理器性能?请叙述你的设想并解释原因。 答案:时钟周期=1/(8MHZ)=125ns 总线周期=4×125ns=500ns 每500ns传输2比特;因此传输速度=4MB/s 加倍频率可能意味着采用了新的芯片制造技术(假设每个指令都有相同的时钟周期数);加倍外部数据总线,在芯片数据总线驱动/锁存、总线控制逻辑的修改等方面手段广泛(或许更新)。在第一种方案中,内存芯片的速度要提高一倍(大约),而不能降低微处理器的速度;第二种方案中,内存的字长必须加倍,以便能发送/接受32位数量。 1.6、考虑一个计算机系统,它包含一个I/O模块,用以控制一台简单的键盘/打印机电传打字设备。CPU中包含下列寄存器,这些寄存器直接连接到系统总线上: INPR:输入寄存器,8位 OUTR:输出寄存器,8位 FGI:输入标记,1位 FGO:输出标记,1位 IEN:中断允许,1位 I/O模块控制从打字机中输入击键,并输出到打印机中去。打字机可以把一个字母数字符号编码成一个8位字,也可以把一个8位字解码成一个字母数字符号。当8位字从打字机进入输入寄存器时,输入标记被置位;当打印一个字时,输出标记被置位。 a. 描述CPU如何使用这4个寄存器实现与打字机间的输入/输出。 b. 描述通过使用IEN,如何提高执行效率? 答案:a.来源于打字机的输入储存在INPR中。只有当FGI=0时,INPR才会接收来自打字机的数据。当数据接收后,被储存在INPR里面,同时FGI置为1。CPU定期检查FGI。如果FGI=1,CPU将把INPR里面的内容传送至AC,并把FGI置为0。 当CPU需要传送数据到打字机时,它会检查FGO。如果FGO=0,CPU处于等待。如果FGO=1,CPU将把AC的内容传送至OUTER并把FGO置为0。当数字符号打印后,打字机将把FGI置为1。 b.(A)描述的过程非常浪费。速度远高于打字机的CPU必须反复不断的检查FGI和FGO。如果中断被使用,当打字机准备接收或者发送数据时,可以向CPU发出一个中断请求。IEN计数器可以由CPU设置(在程序员的控制下)。 1.7、实际上在所有包括DMA模块的系统中,DMA访问主存储器的优先级总是高于处理器访问主存储器的优先级。这是为什么? 答案:如果一个处理器在尝试着读或者写存储器时被挂起, 通常除了一点轻微的时间损耗之外没有任何危害。但是,DMA可能从或者向设备(例如磁盘或磁带)以数据流的方式接收或者传输数据并且这是不能被打断的。否则,如果DMA设备被挂起(拒绝继续访问主存),数据可能会丢失。 1.9、一台计算机包括一个CPU和一台I/O设备D,通过一条共享总线连接到主存储器M,数据总线的宽度为1个字。CPU每秒最多可执行106条指令,平均每条指令需要5个机器周期,其中3个周期需要使用存储器总线。存储器读/写操作使用1个机器周期。假设CPU正在连续不断地执行后台程序,并且需要保证95%的指令执行速度,但没有任何I/O指令。假设1个处理器周期等于1个总线周期,现在要在M和D之间传送大块数据。 a.若使用程序控制I/O,I/O每传送1个字需要CPU执行两条指令。请估计通过D的I/O数据传送的最大可能速度。 b.如果使用DMA传送,请估计传送速度。 答案:a.处理器只能分配5%的时间给I/O.所以最大的I/O指令传送速度是10e6×0.05=50000条指令/秒。因此I/O的传送速率是25000字/秒。 b.使用DMA控制时,可用的机器周期下的数量是 10e6(0.05×5+0.95×2)=2.15×10e6 如果我们假设DMA模块可以使用所有这些周期,并且忽略任何设置和状态检查时间,那么这个值就是最大的I/O传输速率。 1.10、考虑以下代码: for ( i = 0;i < 20;i++) for (j = 0;j < 10;j++) a[i] = a[i]*j a. 请举例说明代码中的空间局部性。 b. 请举例说明代码中的时间局部性。 答案:a.读取第二条指令是紧跟着读取第一条指令的。 b.在很短的间歇时间内, a[i]在循环内部被访问了十次。 1.11、请将附录1A中的式(1.1)和式(1.2)推广到n级存储器层次中。 答案:定义: Ci = 存储器层次i上每一位的存储单元平均花销 Si = 存储器层次i的规模大小 Ti = 存储器层次i上访问一个字所需时间 Hi = 一个字在不高于层次i的存储器上的概率 Bi = 把一个数据块从层次i+1的存储器上传输到层次i的存储器上所需时间 高速缓冲存储器作为是存储器层次1;主存为存储器层次2;针对所有的N层存储器层以此类推。有: Ts的引用更复杂,我们从概率论入手:所期望的值 ,由此我们可以写出: 我们需要清楚如果一个字在M1(缓存)中,那么对它的读取非常快。如果这个字在M2而不在M1中,那么数据块需要从M2传输到M1中,然后才能读取。因此,T2 = B1+T1 进一步,T3 = B2+T2 = B1+B2+T1 以此类推: 所以, 但是, 最后, 1.12、考虑一个存储器系统,它具有以下参数: Tc = 100 ns Cc = 0.01 分/位 Tm = 1200 ns Cm = 0.001 分/位 a.1MB的主存储器价格为多少? b.使用高速缓冲存储器技术,1MB的主存储器价格为多少? c.如果有效存取时间比高速缓冲存储器存取时间多10% ,命中率H为多少? 答案:a.价格 = Cm×8×106 = 8×103 ¢ = $80 b.价格 = Cc×8×106 = 8×104 ¢ = $800 c.由等式1.1知:1.1×T1 = T1+(1-H)T2 (0.1)(100) = (1-H)(1200) H=1190/1200 1.13、一台计算机包括包括高速缓冲存储器、主存储器和一个用做虚拟存储器的磁盘。如果要存取的字在高速缓冲存储器中,存取它需要20ns;如果该字在主存储器中而不在高速缓冲存储器中,把它载入高速缓冲存储器需要60ns(包括最初检查高速缓冲存储器的时间),然后再重新开始存取;如果该字不在主存储器中,从磁盘中取到内存需要12ms,接着复制到高速缓冲存储器中还需要60ns,再重新开始存取。高速缓冲存储器的命中率为0.9,主存储器的命中率为0.6,则该系统中存取一个字的平均存取时间是多少(单位为ns)? 答案:有三种情况需要考虑: 字所在的位置 概率 访问所需时间(ns) 在缓存中 0.9 20 不在缓存,在主存中 (0.1)(0.6)= 0.06 60+20 = 80 不在缓存也不在主存中 (0.1)(0.4)= 0.04 12ms+60+20 = 12,000,080 所以平均访问时间是: Avg = (0.9)(20) + (0.06)(80) + (0.04)(12000080) = 480026 ns 1.14、假设处理器使用一个栈来管理过程调用和返回。请问可以取消程序计数器而用栈指针代替吗? 答案:如果栈只用于保存返回地址。或者如果栈也用于传递参数,这种方案只有当栈作为传递参数的控制单元而非机器指令时才成立。这两种情况下可以取消程序计数器而用栈指针代替。在后者情况中,处理器同时需要一个参数和指向栈顶部的程序计数器。
西安工业大学课程设计用纸 课程名称:汇编语言程序设计 课程英文名称:PROGRAMMING BY ASSEMBLE LANGUAGE 一.设计目的: 1. 理解掌握定时/计数器和中断的使用方法。 2. 掌握微机常用的输入输出方式及接口技术。 3. 掌握一定的汇编语言知识,培养自己的动手操作能力。 4. 学习程序设计的基本思路和方法。 二.程序内容: 第一部分:定义显示界面。 第二部分:调用系统时间,并将调用的用二进制表示的时间数转换成ASCII码,并将时间 数存入内存区。 第三部分:将存在系统内存区的时间数用显示字符串的形式显示出来。 第四部分:获取键盘的按键值,以ESC键退出系统返回DOS。 三.程序设计原理: 首先在数据段开辟一显示缓冲区,用来存储系统时间。调用DOS中断,返回系统时间,并 将来返回的二进制时间转换成ASCII码,方便时间显示时的调用。分别将来小时数、分钟 数、秒数存入显示缓冲区,并最终存入一结束字符号'$'。调用DOS字符串显示功能将时 间显示 西安工业大学课程设计用纸 出来。并调用屏幕I/O中断,定位光标的开始位置,结合着将时间显 示在我们预先定义好的位置上。由于获取了的系统时间不会自动刷 新,所以我们要设计成刷新的方式来不断获取系统的时间,这样就形成了会跳动的电子 钟了。调用延时TIME延时中断服务程序,累加到存放秒值的寄存器DL中,并进行十进制 调整。在累加的过程中,不断地对时、分、秒值进行比较,秒不能等于60,分不能等于 60,时不能等于24。秒等于限制值时,则使秒值为0分值加1;分等于限制值时,则使分 值为0时值加1;时等于限制值时,则使时值为0;时、分、秒值都不超过限制值时,就转 显示屏输出。时间显示的刷新要配合延时程序进行,为了得到良好的显示效果,延时程 序要尽量接近1秒,但又不能超过一秒,所以本程序调用了一段较精确的时间延迟程序。 利用BIOSS设计窗口,选择适当的背景和前景等,使屏幕显示更加完美。程序一旦进入运 行,就将不间断地在显示屏显示时间,要想程序停止运行,可同时在键盘按下ESC键返回 DOS系统。 四.程序流程图如下: DATA SEGMENT ;设置数据段 BUF1 DB 'THE TIME IS NOW: $' BUF5 DB ' @@@@@ ^^^^^^^ @@@@@@ $' BUF6 DB ' &&&&&& ####### &&&&&& $' BUF7 DB ' 00 >o o < 00 $' BUF8 DB ' 00 (::) 00 $' BUF9 DB ' 00 ~~ 00 $' BUF10 DB ' 00 !! 00 $' BUF3 DB 'CLASS:040402206 $' BUF4 DB 'NAME:hu ling wei $' BUF2 DB 10 DB 10 DUP(?) DATA ENDS STACK SEGMENT STACK ;设置堆栈段 DB 100 DUP(?) STACK ENDS CODE SEGMENT ;设置代码段 ASSUME CS:CODE,DS:DATA,SS:STACK CURSOR MACRO ROW,CLM ;设置光标位置 MOV AH,2 MOV BH,0 MOV DH,ROW MOV DL,CLM INT 10H ENDM WIN MACRO ROWL,CLML,ROWR,CLMR,COLOR ;设置窗口,位置,颜色 MOV AH,6 MOV AL,0 MOV CH,ROWL MOV CL,CLML MOV DH,ROWR MOV DL,CLMR MOV BH,COLOR INT 10H ENDM ASCBCD MACRO REG INC BX INC BX MOV REG,[BX] MOV CL,4 SHL REG,CL INC BX MOV AL,[BX] AND AL,0FH OR REG,AL ENDM BCDASC MACRO REG INC BX INC BX MOV AL,REG MOV CL,4 SHR AL,CL OR AL,30H MOV [BX],AL INC BX MOV AL,REG AND AL,0FH OR AL,30H MOV [BX],AL ENDM INCBCD MACRO REG,COUNT ;BCD数加1 MOV AL,REG INC AL DAA MOV REG,AL CMP AL,COUNT JNZ DISPY MOV REG,0 ENDM STRDSPY MACRO ADRS LEA DX,ADRS MOV AH,9 INT 21H ENDM CLOCK PROC FAR START: PUSH DS ;显示字符串 MOV AX,0 PUSH AX MOV AX,DATA MO

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值