第四章汇编语言

第四章汇编语言
第四章汇编语言

4.1汇编语言概述

语言分机器语言、低级语言、高级语言,机器语言由0和1构成,只有专业人士才能看懂。低级语言就是汇编语言,用助记符来表示,最贴近机器硬件,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言高级语言分为面向过程和面向对象的语言。

1 顺序结构

顺序程序设计,又叫直接程序设计。它是相对于分支程序和循环程序设计而言的。因此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也不重复执行某些指令,一直执行到最后一条指令为止。

2 分支结构

(1).分支程序设计概述

分支程序结构可以有两种形式,如图所示

(2)分支程序设计

分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。根据对条件的判断而选择不同的处理方法是人的基本智能体现。

3 循环程序设计

1.循环程序设计概述

有时我们会需要能按一定规律,多次重复执行的一串语句,这类程序叫循环程序。

循环程序一般由四个部分组成:

(1)循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。循环初值分两类:一类是循环工作部分的初值,别一类是控制循环结束条件的初值。

(2)工作部分:即需要重复执行的程序段。这是循环的中心,称之为循环体。

(3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。

(4)控制部分:用来保证循环程序按规定的次数或特写条件正常循环。

4.2 汇编语言的语句

4.2.1语句分类:汇编语言语句分为指令性语句、伪指令、宏指令。

4.2.2语句格式:[标号] 操作码 [操作数] [注释]

汇编语言源程序中的每个语句可以由4项组成,格式如下

[name] operation operand [;comment]

[名字项] 操作项操作数项;注释项

下面分别说明各项的表示方法。

1.名字项

源程序中用下列字符表示名字:

字母:A~Z或a~z;

数字:0~9;

专用字符号:?、?、@、―、$;

一般来讲,名字项可以是标号或变量。

(1)标号:在代码段定义,后面跟冒号:

它有三种属性:段、偏移及类型。

①段属性:定义标号的段起始地址,在CX寄存器中。

②偏移属性:16位无符号数。

③类型属性:用来指出该标号是在本段内引用还是在其他段内引用的。

(2)变量:变量在除代码以外的其他段中定义,后面不跟冒号。它也可以用LABLE或EQU 伪操作来定义。变量经常在操作数字段出现。

它也有段、偏移及类型三种属性。

①段属性定义变量的段起始地址,此值必须在一个段寄存器中。

②偏移属性变量的偏移地址是16位无符号数,它代表从段的起始地址到定义变量的位置之间的字节数。在当前段内给出变量的偏移值等于当前地址计数器的值,当前地址计数器的值可以用 $ 来表示。

③类型属性变量的类型属性定义该变量所保留的字节数。

2.操作项

操作项可以是指令、伪操作或宏指令的助记符。

3.操作数项

操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。

4.注释项

注释项用来说明一段程序或一条或几条指令的功能,它是可有可无的。

4.3汇编语言源程序的伪指令

段定义伪操作的格式如下:

segment-name SEGMENT

… segment-name ENDS

其中删节号部分,对于DS、ES和SS来说,一般是存贮单元的定义、分配等伪操作;对于代码段则是指令及伪操作此外,还必须明确段和段寄存器的关系,这可用ASSUME伪操作来实现,其格式为:

ASSUME assignment,…,assignment

其中 assignment 说明分配情况,其格式为:

〈段寄存器名〉:〈段名〉

其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名则必须是由SEGMENT定义的段中的段名。 4、2、.3 汇编语言源程序的结构

汇编语言源程序的程序基本结构是段,一个汇编语言源程序由若干个代码段、数据段、附加段和堆栈段组成。段之间的顺序可以随意安排,通常数据段在前,代码段在后。任何可执行汇编语言程序至少要有一个代码段,通常还可能有数据段和堆栈段。每个段都有段首指令和段结束指令,段的内容介于这两条指令之间。

1.算术运算符

算术运算符主要包括+、-、*、/和MOD、[]等。其中MOD是指除法运算后得到的余数。

语法格式为:

expr1[expr2]等价于expr1+expr2。

2.逻辑运算符

逻辑运算符主要包括AND、OR、XOR、NOT、SHR及SHL。逻辑操作符是按位操作的,它只能用于数字表达式中。

3.关系运算符

关系运算符主要包括EQ(相等时为真)、NE(不相等时为真)、LT(小于时为真)、GT(大于

时为真)、LE(小于或等于时为真)、GE(大于或等于时为真)等6种。

4.数值回送(Value returning)操作符

它有TYPE、LENGTH、SIZE、OFFSET、SEG 5种。这些操作符把一些特征或存储器地址的一部分作为数值回送。下面分别说明各个操作符的功能。

(1)TYPE

格式:TYPE Variable或label

如果是变量,则汇编程序将回送该变量的以字节数表示的类型,DB为1,DW为2,DD为4,DQ为8,DT为10。

如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR为-1,FAR为-2。

(2)LENGTH

格式为:LENGTH Variable

对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元个数。而对于其他情况则回送1。

(3)SIZE

格式为:SIZE Variable

其汇编的值为LENGTH Variable * TYPE Variable,即回送直接分配给该变量的总的字节数。(4)OFFSET

格式为:OFFSET Variable或label

汇编程序将回送变量或标号的偏移地址值。

(5)SEG

格式为:SEG Variable或label

汇编程序将回送变量或标号的段地址值。

5.属性操作符

属性操作符主要包括PTR、段操作符、SHORT、THIS、HIGH和LOW 6种。

(1)PTR

格式为:type PTR expression

PTR用来建立一个符号地址,但它本身并不分配存储器,只是用来对已分配的存储地址赋予另一种属性,使该地址具有另一种类型。

(2)段操作符:

用来表示一个标量、变量或地址表达式的段属性。例如,用段前缀指定某段的地址操作数MOV AX,ES:[BX+SI]。可见它是用段寄存器地址表达式来表示的。

(3)SHORT

用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址±127个字节范围之内。

(4)THIS

格式为:THIS attribute或type

(5)HIGH和LOW

称为字节分离操作符,它接收一个数或地址表达式,HIGH取其高位字节,LOW取其低位字节1.4 伪指令

构成汇编语言源程序的语句主要包括两类:

指令和伪指令。

指令是在程序运行期间有CPU执行的,汇编后由对应的机器代码所取代。

伪指令是不可执行的,它只是在源程序汇编期间由汇编器处理的命令,用来指示汇编器为数据分配内存空间,或者为汇编器提供源程序结束或段定义等信息。 1、变量定义伪指令

变量定义伪指令用来为数据分配内存空间,并设置相应内存单元的初始值,其形式为:[变量名] 变量定义符操作数[,…,操作数]

变量名是一个符号地址,表示其后操作数的首地址,多个操作数构成一个数组。变量名是程序员给出的标识符,为可选项,给出变量名只是为了按名存取其对应的内存单元。

变量定义符主要包括下列几种:

(1)DB(Define Byte):定义字节,后面的每个操作数占1个字节。

(2)DW(Define Word):定义字,后面的每个操作数占1个字。

(3)DD(Define DWord):定义双字,后面的每个操作数占2个字。

(4)DQ(Define QWord):定义四字,后面的每个操作数占4个字。

(5)DT(Define Tbyte):定义十字节,后面的每个操作数占10个字节。

2、符号定义伪指令

符号定义伪指令的基本形式为:

符号名 EQU 表达式

符号名 = 常数表达式

功能:给表达式指定一个等价的符号名。

说明:

(1)=后的表达式只能是常数,对于字符或字符串,在汇编时按整数处理。

(2) EQU后的表达式可以是数值、字符串,甚至可以是寄存器名、指令的助记符等。(3) EQU不能重复定义,而“=”伪指令可以重复定义,其作用域从定义点到重新定义之前。

3、段定义伪指令

汇编语言源程序由一个段或多个段组成,多数程序采用一个代码段、一个数据段和一个堆栈段。段定义由SEGMENT与ENDS伪指令实现,基本形式如下:

段名 SEGMENT [STACK]

〈语句序列〉

段名 ENDS

4、程序开始和结束伪操作

在程序的开始可以用NAME或TITLE为模块的名字,NAME的格式是:

NAME module_name作为模块的名字。如果程序中没有NAME 伪操作,则也可使用TITLE伪操作,其格式为:

TITLE text

1、5 宏指令与条件汇编

1.宏定义和宏调用

宏是源程序中一段有独立功能的程序代码。它只需要在源程序中定义一次,就可以我次调用它,调用时只需要有一个宏指令语句就可以了。

宏定义是用一组伪操作来实现的。其格式是:

macro name macro [dummy parameter list]

┇ (宏定义体)

ENDM

经宏定义定义后的宏指令就可以在源程序中调用。

这种对宏指令的调用称为宏调用,宏调用的格式是:

macro name [actual parameter list]

当源程序被汇编时,汇编程序将对每个宏调用作宏展开。宏展开就是用宏定义体取代源程序

中的宏指令名,而且有实元取代宏定义中的哑元。

4.4完整汇编语言的上机过程

4.4.1有输入输出的程序上机过程:后面DOS功能调用中的内容

用编辑器EDIT或记事本输入源程序,存为*.ASM

用MASM汇编*.ASM,生成*.OBJ,若有错误,根据错误再次调试

用LINK 链接*.OBJ,生成*.EXE,直接运行*.EXE

4.4.2无输入输出的程序上机过程:

用编辑器EDIT或记事本输入源程序,存为*.ASM

用MASM汇编*.ASM,生成*.OBJ,若有错误,根据错误再次调试

用LINK 链接*.OBJ,生成*.EXE

运行DEBUG,反汇编*.EXE,到源程序-U,用-T,-G,运行就可以了。

4.5汇编语言程序设计

4.5.1 顺序结构

顺序程序设计,又叫直接程序设计。它是相对于分支程序和循环程序设计而言的。因此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也不重复执行某些指令,一直执行到最后一条指令为止。

4.5.2 分支结构

(1).分支程序设计概述

分支程序结构可以有两种形式,如图所示

(2)分支程序设计

分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。根据对条件的判断而选择不同的处理方法是人的基本智能体现。

4.5.3 循环程序设计

1.循环程序设计概述

有时我们会需要能按一定规律,多次重复执行的一串语句,这类程序叫循环程序。

循环程序一般由四个部分组成:

(1)循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。循环初值分两类:一类是循环工作部分的初值,别一类是控制循环结束条件的初值。

(2)工作部分:即需要重复执行的程序段。这是循环的中心,称之为循环体。

(3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。

(4)控制部分:用来保证循环程序按规定的次数或特写条件正常循环。

4.4.5子程序设计

4子程序设计

在程序设计过程中,经常会遇到一些功能结构相同,仅是某些变量的值不同的程序段在程序中的不同部分多次出现,这样的重复编程既烦琐又费时。为此,在设计程序时,可把这些程序段独立出来,按一定的格式编写,成为可以被其他程序多次调用的程序。这样的程序段称为子程序或称过程。通常,调用子程序的程序称为主程序。主程序和子程序是相对而言的,子程序还可调用别的子程序。在编程时,使用子程序可以减少编程工作量,节省存储空间,并易于实现程序的模块化,使程序结构清晰和便于调试。

子程序(过程)调用与返回指令

4.1 子程序调用指令CALL

格式:CALL dst

执行此指令时,首先把子程序的返回地址(CALL指令后面1条指令的地址称为断点地址,即当前指令指针寄存器IP的内容)压入堆栈保护,以便返回主程序时,从下一条指令继续往下执行,然后把子程序的入口地址送人IP,无条件地转移到dst所指的目标地址,去执行子程序。

根据主程序与子程序在内存中所处的位置关系和使用不同的寻址方式,可以分为段内直接、段内间接、段间直接、段间间接4种调用方式,详见表6-1。

4.2 子程序返回指令RET

RET指令使计算机结束子程序的执行返回主程序。RET指令一般放在子程序的尾部,当子程序执行完后,能够正确地返回到调用指令CALL后的指令处继续执行。

指令格式:

RET [N]

说明:当执行RET时,将返回到主程序中调用子程序语句的下一语句继续执行程序。由于调用语句有段内和段间调用之分,相对RET语句就有段内返回和段间返回的区别。

N为任选项,若选择N,N必须是立即数,且为偶数。执行返回指令时,先从堆栈弹出断点地址,然后再调整堆栈指针SP,即:

SP←(SP)十N个字节。

1.段内返回

子程序与主程序在同一段内的返回就是段内返回。

恢复断点:IP←((SP))

SP←(SP)+2

2.段间返回

子程序与主程序不在同一段内的返回,便是段间返回。执行过程为:

恢复断点:IP←((SP))

SP←(SP)+2

CS←((SP))

SP←(SP)+2

6.2 子程序的设计方法

4.2.1 子程序的定义

子程序的定义是由过程伪指令来实现的,其格式为:

<过程名> PROC <类型属性>

:过程体

<过程名>ENDP

过程名为标识符,又是子程序的人口的符号地址,其写法和标号的写法相同。

类型属性可以是NEAR或FAR。NEAR属性为段内调用;FAR属性为段间调用。汇编程序根据类型属性来确定CALL和RET指令的属性。用户对子程序属性的确定原则是:调用程序和子程序在同一代码段中使用NEAR属性(默认);调用程序和子程序不在同一代码段中则使用FAR属性。

[例6.3] 主程序和子程序在同一代码段中的子程序调用和定义示例:

CODE SEGMENT

MAIN PROC FAR ;主程序,可以是FAR类型

CALLSUB

MAIN ENDP

SUB PROC NEAR ;子主程序同处CODE是NEAR类型,NEAR可省略

RET

SUB ENDP

CODE ENDS

[例6.4]主程序和子程序不在同一代码段中的子程序调用和定义示例:

CODE SEGMENT ;段一

MAIN PROC FAR

CALL FAR PRT SUB ;指明FAR子程序SUB不在本段内

MAIN ENDP

CODE ENDS

CODE1 SEGMENT ;段二

SUB PROC FAR ;指明FAR,表示本子程序可被其他段调用

RET

SUB ENDP

CODE1 ENDS

6.2.2 子程序的调用和返回

子程序的正确执行是由子程序的正确调用及正确返回保证的。汇编源程序中的CALL 和RET指令就是完成调用和返回功能的。在调用子程序时要把返回地址入栈,在返回时要把返回地址出栈,所以用户应注意程序运行期间的堆栈状态,不能破坏堆栈里的返回点,因此在子程序中使用堆栈要特别小心,以免发生错误。

6.2.3 寄存器的保存与恢复——保护与恢复现场

由于主程序和子程序具有相互独立性,而CPU中的寄存器是大家共用的,所以它们在使用寄存器时会发生冲突,即若主程序在调用子程序之前的某一寄存器中的内容在从子程序返回后还有用,而子程序中又恰好使用了此寄存器,这样就会破坏寄存器中原有内容,从而造成在返回主程序后程序因数据的丢失而出现错误。为了避免这种错误的产生,在一进入子程序后就应把子程序中所使用到的寄存器内容保存在堆栈中,而在退出子程序之前再把堆栈中的内容恢复到原寄存器中,即对现场进行保护。

[例6.5] 寄存器的保存与恢复示例:

SUBl PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

POP DX

POP CX

POP BX

POP AX

RET

SUBl ENDP

用户应仔细考虑哪些寄存器是必须保存的,哪些寄存器是不必要或不应该保存的。一般子程序中用到的寄存器是要保存的,但是,用来在主程序和子程序之间传递参数的寄存器不能保存。

6.3 子程序的参数传递

主程序在调用子程序时,经常需要向子程序传递一些参数;子程序执行完后也需要向主程序返回一些数据。这种主程序和子程序之间的数据传递称为参数传递。在汇编程序中,参数传递的方法主要有以下几种。

6.3.1 通过寄存器传递参数

这是最常用的一种方法,使用方便,但因受到CPU寄存器个数的限制,一般用于参数较少的情况。

例6.6 P120

6.3.2用参数表传递参数

用于大量参数的传递

例 6.7 P121

6.3.3 通过堆栈传递参数或参数地址

用于多参数、子程序嵌套调用和递归调用

4.4.6 DOS功能调用

1 DOS系统功能调用

1.系统功能调用方法

为了使用方便,DOS系统调用已将所有子程序按顺序编号。一共有87个子程序,编号从0~57H。调用时应包括如下3个方面的内容:

(1)人口参数初始化;

(2)子程序编号送人AH;

(3)INT 21H ;子程序请求中断指令

有的子程序不需要人口参数,但大部分需将参数送人指定地点。

程序员只需给出这三方面的信息,不必关心具体程序如何、在内存中的存放地址如何,DOS会根据所给的信息,自动转入相应的子程序去执行。调用结束后若有出口参数,一般

在寄存器中。有些子程序,如屏幕显示字符,调用结束会在屏幕上马上看到结果。下面简单地介绍几个常用的DOS功能调用。

2.基本I/O功能调用

1)键盘单个字符输入偷出

键盘单个字符输入,有AH=1、7、8三种子功能调用,例如:

MOV AH,1

INT 21H

执行上述指令,系统将扫描键盘,等待有键按下。一旦有键按下,就将键值(相应字符的ASCII码值)读人。先检查是否是,若是,则退出命令执行;否则将键

值送人AL寄存器,同时将这个字符显示在屏幕上。

AH=8与AH=1功能类似,只是不在屏幕上显示输入的字符。

AH=7,等待从标准输入设备输入字符,然后将其送人AL,但不显示,也不对字符做

检查。

键盘单个字符输出的子功能调用为AH=2,它要求将显示字符的ASCII码(人口参数) 送给寄存器DL,显示时光标跟随字符移动。并检查是否是。若是,则退出

命令执行不再显示。例如,下列代码可实现将字符“:”送人屏幕(或打印机)显示的功能。 MOV DL,“:”

MOV AH,2

INT 21H

2)输出字符串(9号调用)

AH=9的功能是显示字符串,它要求DS:DX必须指向内存中一个以“$”作为结束标志的字符串。有些ASCII码,如控制码,不能出现在该字符串中。显示字符串时,如果希望光标能自动换行,那么可在字符串结束之前加上回车和换行的ASCII码。

[例10.3] 屏幕显示:HOW DO YOU DO?

DATA SEGMENT

BUF DB‘HOWDOYOUDO?’,0DH,0AH,‘$’

DATA ENDS

CODE SEGMENT

MOV AX,DATA

MOV DS,AX

MOV DX,OFFSETBUF

MOV AH,9

INT 21H

CODE ENDS

使用INT21H显示字符串,一定要在显示串之后加上定界符$,丢失定界符可能会在屏幕上引起意想不到的后果。

3) 字符串输入(0AH号调用)

AH=10的功能是从键盘接收字符串到用户定义的输入缓冲区中。缓冲区内第一个字节指出缓冲区能容纳的字符个数。如果键人的字符数比此数大,就会发出“嘟嘟”声,而且光标不再向右移动;若实际输入的字符数少于定义的字节数,缓冲区内其余字节填0。第二个字节是实际输入字符的个数,这个数据由该功能自动填人。从第三个字节开始按字节存放从键盘上接收的字符,最后结束字符串输入的回车符0DH还要占用1B,因此整个缓冲区的字节空间应为最大字符数(包括Return在内)加2。调用时,要求DS:DX 指向输入缓冲区。(实验4)

[例10.4]

DATA SEGMENT

BUF DB 16 ;缓冲区长度

DB ? ;保留为系统填人实际输入的字符个数

DB 16 DUP(?) ;定义16B存储空间

DATA ENDS

CODE SEGMENT

MOV AX,DATA

MOV m,AX

MOV DX,OFFSETBUF

MOV AH,10

INT 21H

CODE ENDS

如果键人字符串:

HOW DO YOU DO?

此时缓冲区BUF的各存储单元内容如下所示:

4)利用DOS中断调用AH=25H号可设置新的中断向量,用AH=35H号可取原中断矢量

[例10.5] 设置0AH的新的中断矢量。

(1)首先用AH=35H的DOS系统调用得到原中断处理程序地址

MOV AH,35H ;AH=DOS中断的调用号

MOV AL,0AH AL二类型号

INT 21H ;DOS中断调用,取得原中断向量在ES:BX中

MOV AX,ES

MOV CSR,AX ;保存原中断处理程序段地址于CSR单元中

MOV IPR,BX ;保存原中断处理程序偏移量于IPR单元中

(2)设置新的中断矢量

MOV DX,SEG INTPR ;取新的中断处理程序段地址到DS中

MOV DS,DX

MOV DX,OFFSETINTR ;取新的中断处理程序偏移量到DX中

MOV AH,25H ;AH=IX)S中断的调用号

MOV AL,0AH ;AL=类型号

INT 21H DOS中断调用,将新的中断向量送人向量表的对应单元中

5)利用DOS系统功能调用实现人机对话

[例10.6] 下述程序可以在屏幕上显示一行提示信息,然后接收用户从键盘输入的信息并将其存人内存缓冲区。

DATA SEGMENT

PARS DB 100 定义输入缓冲区

DB ? ;准备接收键盘输入信息

DB 100 DUP(?)

ME56l DB ‘WHAT IS YOU NAME’;要显示的提示信息

DB ‘$’;提示信息结束标志

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

MAIN PROC FAR

START:PUSH DS

MOV AX,0

PUSH AX

MOV AX,DATA

MOV DS,AX

DISP:MOV DX,OFFSET MESG

MOV AH,9 ;利用9号功能调用

INT 21H ;显示提示信息

KEYBO:MOV DX,OFFSETPARS

MOV AH,10 ;利用10号调用

INT 21H ;接收键盘输入

RET

MAIN ENDP

CODE ENDS

END START

2 ROM BIOS中断调用

(1).ROM BIOS的调用方法

ROM BIOS使用了中断类型号8~FH,10H-1FH,40H,41H,70H-77H部分中断类型的功能见附录D。中断调用的方法是:首先给出人口参数,然后写明软件中断指令。例如:INT 12H

这将调用存储器容量测试程序。这个程序不需要人口参数,它以1KB为测试单位,并将测试结果送人AX寄存器。

通常BIOS程序保护除AX和状态标志位以外的所有寄存器,BIOS程序清单中每一个功能模块的说明中都确切地注明了寄存器的使用情况。

(2).中断调用举例

下面就部分常用BIOS中断调用加以介绍,详细情况请参阅BIOS中断调用的有关资料。

时间中断调用(1AH)

INT lAH中断调用有两个功能,功能号在AH中,AH=0、1。

(1)AH=0的功能为:读取时间计数器的当前值。

出口参数:CX=计数值的高位字,DX=计数值的低位字。若上次读它后,计数未超过24小时,AL=0;否则AL≠0。

[例9.7]

MOV AH,0

INT 1AH

调用结果,在CX:DX得到时间计数器的当前值。因为时间计数器每55ms自动加1,所以CX:DX中的数除以65 520得小时数,余数再除以1 092得分数,所得余数再除以18.2得秒数。

(2)AH=1的功能为:设置时间计数器的当前值。

人口参数:AH=I,CX=时间值的高位字。DX=时间值的低位字。

出口参数:时间计数器设为CX与DX中的值。时间计数器每55ms自动加1。

[例9.8]将时间计数器的当前值设置为0。

MOV AH,1

MOV CX,0

MOV DX,0

1NT 1AH

可用1AH中断调用作为定时控制。

[例10.9] 要求每隔5.5s从键盘读一个字符并将这个字符的ASCII码送人内存输入缓冲区中,共读人100个字符。实现这个要求的程序如下:

XI DB 100 DUP(?) ;定义100B的输入缓冲区

STR: MOV CX,100

LEA BX,XI

STI

LOPl: MOV AH,1

PUSH CX

MOV CX,0

MOV DX,0

INT 1AH 设置时间计数器为0

LOP2: MOV AH,0

INT 1AH 读时间计数值

CMP DL,100

JNZ LOP2

MOV AH,0

INT 16H 从键盘接受字符

MOV [BX],AL

INC BX

POP CX

LOOP LOPl

HLT

[例9.10] 计算程序执行时间。

常用的几个功能号:

4.4.6典型程序举例

表的操作

一、换码指令(表)的应用:

例题:在内存TAB出存有0—15的平方表,求X的平方值并给变量Y.

DATA SEGMENT

TAB DB 0,1,4,9,16,25,36,……,225

X DB 8

Y DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:

MOV AX,DTA

MOV DS,AX

MOV BX,OFFSET TAB

MOV AL,X

XLAT

MOV Y,AL

CODE ENDS

END START

例题:密码转换,从键盘输入一个数字0—9,加密后存入MIMA单元数字0—9的加密数字分别是7、5、9、1、3、6、8、0、2、4 DATA SEGMENT

MITAB DB ‘7591368024’

COUNT DB $-MITAB

JMITAB DB ‘7384915062’

MIMA DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:

MOV AX,DATA

MOV DS,AX

MOV AH,1

INT 21H

AND AL,0FH

LEA BX,MITAB

XLAT

MOV MIMA,AL

CODE ENDS

END START

进制的转换和多位操作

二、进制转换类

1、把内存压缩BCD数据X,转换为十进制数。

DATA SEGMENT

X DB 32H

Y DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:

MOV AX,DTA

MOV DS,AX

MOV AL,X

MOV CL,4

SHR AL,CL

MOV BL,10

MUL BL

MOV BH,X

AND BH,OFH

ADD AL,BH

MOV Y,AL

CODE ENDS

END START

三、十进制数算术运算。

例题:编程进行加法运算12346ACDH+6ACB12EFH DATA SEGMENT

X DB 0CDH,6AH,34H,12H,0

Y DB 0EFH,12H,0CBH,6AH

Z DB 5 DUP(?)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:

MOV AX,DATA

MOV DS,AX

CLC

MOV CL,5

MOV BX,OFFSET X

MOV SI,OFFSET Y

MOV DI,OFFSET Z

L1:

MOV AL,[BX]

ADC AL,[SI]

MOV Y,AL

INC BX

INC SI

INC DI

LOOP L1

CODE ENDS

END START

第4章汇编语言程序设计.

第四章习题集 一、判断 (正确的在括号画“√” , 错误的画“×” 1. 汇编语言程序语言必须由四部分组成。 ( 2. 汇编语言源程序中所使用的变量,必须在代码段中先定义,后引用。 (错 3. 在汇编语言中,一般伪指令语句放在代码段中 (错 4. 逻辑操作符 AND 、 OR 、 XOR 或 NOT ,只能用于数字表达式。 ( 错 5. 符号定义语句不占内存单元,变量定义语句占内存单元。 ( 6. 汇编语言源程序中至少有一个代码段。 ( 对 7. 伪指令是指示性语句 , 不产生机器目标代码。( √ 8. 伪指令BV AR :DB ‘ ABCD ’ , 200 DUP(?是合法伪指令。 9. 伪指令 DAT1 DB 7, 8, 9, 10 与 DA T1 DW 07H, 08H , 09H , 0AH 所预置的数据是一样的。 10. 8086CPU 的中断向量表共占有 1024个字节 (00000H -003FFH , 所以共有1024个中断。 [ ] 二、单项选择题 1. 用高级语言编写的程序(C 。 A 、只能在基本种计算机上运行 B 、无需经过编译或解释,即可被计算机直接执行 C 、具有通用性和可移植性 D 、几乎不占用内存空间 2. 一般地,我们将计算机指令的集合称为(B 。 A . 机器语言 B. 汇编语言 C. 模拟语言 D. 仿真语言

3. 我们通常所说的“裸机”指的是(C 。 A. 只装备有操作系统的计算机 B. 不带输入输出设备的计算机 C. 未装备任何软件的计算机 D. 计算机主机暴露在外 4. 计算机的软件系统一般分为(C 两大部分。 A. 系统软件和应用软件 B. 操作系统和计算机语言 C. 程序和数据 D. DOS 和 Windows 5. 计算机系统软件中的汇编程序是一种 ( C 。 A. 汇编语言程序 B. 编辑程序 C. 翻译程序 D. 将高级语言转换成汇编程序的程序 6. 假设 V1和 V2是用 DW 定义的变量,下列指令中正确的是:A A. MOV V1,20H B. MOV V1, V2 C. MOV AL,V1 D. MOV 2000H , V2 7. PC 机所使用的标准键盘向主机发送的代码是 A A . ASCII 码 B . 扫描码 C. BCD 码 D. 格雷码 8. 8086CPU 中断号为 8的中断矢量存放在(C 。 A. 0FFFFH :0008H B. 0000H :0008H C. 0000H :0020H D. 0020H :0000H 9. 已知变量 VAR 为字型,则 TYPE VAR=(B 。 A 、 1 B 、 2 C 、 3 D 、 4

第四章汇编语言程序设计题库

第四章汇编语言程序设计练习题 一、单项选择题(共40题) 1、关于指令MOV [BX],AX,以下叙述正确的是: A、目的操作数是寄存器操作数 B、源操作数是内存操作数 C、目的操作数是内存操作数 D、源操作数是立即操作数 2、执行下列程序,设(SS)=2000H,执行后(SP)=? MOV SP,2000H MOV AX,1234H PUSH AX A.21FFEH B.20000H C.22000H D.22002H 3、运算型指令的寻址和转移型指令的寻址,其不同点在于 A.前者取操作数,后者决定程序的转移地址 B.后者取操作数,前者决定程序的转移地址 C.两者都是取操作数 D.两者都是决定程序的转移地址 4、MOV ( ),300 A、WORD PTR [DX] B、BYTE PTR [BX] C、WORD PTR [BP] D、 AL 5、汇编语言程序代码必须位于代码段中,形成代码段物理地址的寄存器对是 A.SS: SP B.CS: IP C. DS: BX D. CS: BX 6、若定义DAT DW 'A',则(DAT)和(DAT+1)两个相邻的内存中存放的数据是() A.0041H B.4100H C.××41H D.4l××H 7、执行下面的程序段后,(AX)=() TAB DW 1,2,3,4,5,6 ENTRY EQU 3 MOV BX,OFFSET TAB ADD BX,ENTRT MOV AX,[BX] A.0003H B.0300H C.0400H D.0004H 8、下面表示段定义结束的命令是() A.ENDP B.ENDS C. ENDM D.END 9、设AL、BL,中都是带符号数,当AL<BL时转至NEXT处,在CMP AL,BL指令后应选用正确的条件转移指令是()

汇编语言程序设计(第四版)第4章【课后答案】

汇编语言程序设计第四版 【课后习题答案】--囮裑為檤第4章基本汇编语言程序设计 〔习题4.1〕例题4.2如果要求算术右移8位,如何修改程序。 〔解答〕 思路:首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h到最高位字节;如为1,送ffh到最高位字节。传送可参考例题4.2,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成: .model small .stack 256 .data qvar dq 1234567887654321h .code .startup mov cx,7 mov si,1 again: mov al, byte ptr qvar[si] mov byte ptr qvar[si-1],al inc si loop again test al,80h jz ezz mov bl,0ffh jmp done ezz: mov bl,0 done: mov byte ptr qvar[7],bl .exit 0 end 〔习题4.2〕例题4.2如果要求算术左移7位,如何用移位指令实现。 〔解答〕 思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次,次低位字节至最高位字节依次带CF 位循环左移一次(内循环共8次),外循环体控制执行7次即可。 .model small .stack 256 .data qvar dq 1234567887654321h

.code .startup mov dx, 7 ;外循环次数 mov ax, byte ptr qvar[0] ;最低位字节送ax lpp: shl ax, 1 ;最低位字节左移一次,其d7移入CF位mov si, 1 mov cx, 7 ;内循环次数 again: rcl byte ptr qvar[si], 1 ;高位字节依次左移P50 inc si loop again dec dx jnz lpp .exit 0 .end 〔习题4.3〕将AX寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL、BL、CL和DL寄存器中。 〔解答〕 思路:设这四组从低位到高位分别放在AL、BL、CL和DL寄存器中。仅列出代码段:mov bl, al ;将al中的两组分开 and al, 0fh ;屏蔽高四位后送al mov cl, 4 ;原al中的数据逻辑右移4次送bl shr bl, cl mov dl, ah ;将ah中的两组分开 and dl, 0f0h ;屏蔽低高四位后送dl mov cl, 4 ;原ah中的数据逻辑右移4次送dl shr dl, cl mov cl, ah ;屏蔽高四位后送cl and cl, 0fh 〔习题4.4〕编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。 〔解答〕 getkey: mov ah, 1 ;从键盘输入,出口:al存键值 int 21h cmp al, 'a' ;判键值是小写字母? jb getkay cmp al, 'z' ja getkay sub al,20h ;是小写字母转换为大写字母 mov dl,al mov ah, 02h ;显示 int 21h 〔习题4.5〕已知用于LED数码管显示的代码表为:

汇编语言程序设计(第四版)第1_4章【课后答案】

汇编语言程序设计第四版 【课后习题答案】 第1章汇编语言基础知识 〔习题1.1〕简述计算机系统的硬件组成及各部分作用。 〔解答〕 CPU:包括运算器、控制器和寄存器组。运算器执行所有的算术和逻辑运算;控制器负责把指指令逐条从存储器中取出,经译码分析后向机器发出各种控制命令,并正确完成程序所要求的功能;寄存器组为处理单元提供所需要的数据。 存储器:是计算机的记忆部件,它用来存放程序以及程序中所涉及的数据。 外部设备:实现人机交换和机间的通信。 〔习题1.2〕明确下列概念或符号:主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB。 〔解答〕 主存又称内存是主存储器的简称,主存储器存放当前正在执行的程序和使用的数据,CPU可以直接存取,它由半导体存储器芯片构成其成本高、容量小、但速度快。辅存是辅助存储器的简称,辅存可用来长期保存大量程序和数据,CPU需要通过I/O接口访问,它由磁盘或光盘构成,其成本低、容量大,但速度慢。 RAM是随机存取存储器的英语简写,由于CPU可以从RAM读信息,也可以向RAM写入信息,所以RAM也被称为读写存储器,RAM型半导体存储器可以按地址随机读写,但这类存储器在断电后不能保存信息;而ROM中的信息只能被读出,不能被修改,ROM型半导体通常只能被读出,但这类存储器断电

后能保存信息。 存储器由大量存储单元组成。为了区别每个单元,我们将它们编号,于是,每个存储单元就有了一个存储地址,I/O接口是由一组寄存器组成,为了区别它们,各个寄存器进行了编号,形成I/O地址,通常称做I/O端口。 KB是千字节、MB是兆字节、GB是吉字节和TB是太字节,它们都是表示存储器存储单元的单位。 〔习题1.3〕什么是汇编语言源程序、汇编程序、目标程序? 〔解答〕 用汇编语言书写的程序就称为汇编语言源程序;完成汇编工作的程序就是汇编程序;由汇编程序编译通过的程序就是目标程序。 〔习题1.4〕汇编语言与高级语言相比有什么优缺点? 〔解答〕 汇编语言与高级语言相比的优点:由于汇编语言本质就是机器语言,它可以直接地、有效地控制计算机硬件,因而容易产生运行速度快,指令序列短小的高效目标程序,可以直接控制计算机硬件部件,可以编写在“时间”和“空间”两方面最有效的程序。 汇编语言与高级语言相比的缺点:由于与处理器密切相关导致通用性差、可移植性差,汇编语言功能有限,又涉及寄存器、主存单元等硬件细节,编写汇编语言比较繁琐,调试起来也比较困难,编译程序产生的目标程序往往比较庞大、程序难以优化,运行速度慢。 〔习题1.5〕将下列十六进制数转换为二进制和十进制表示 (1)FFH (2)0H (3)5EH

第四章 汇编语言程序设计

第四章汇编语言程序设计 1、编程将片内40H~60H单元中的内容送到以3000H为首的存储区内。 答:MOV R1,#40H MOV R2,#21H MOV DPTR,#3000H L1: MOV A,@R1 MOVX @DPTR,A INC R1 INC DPTR DJNZ R2,L1 2、编程计算下列算式的程序 (1)23H+45H+ABH+03H= MOV A,#23H ADD A,#45H ADD A,#0ABH XCH A,B ;溢出处理 ADDC A,#00H XCH A,B ADD A,#03H ;A中为结果低位,B中为高位 (2)CDH+15H-38H-46H= MOV A,#0CDH ADD A,#15H SUBB A,#38H SUBB A,#46H (3)1234H+8347H= MOV A,#34H ADD A,#47H MOV 30H,A MOV A,#12H ADDC A,#83H MOV 31,A ;30H存结果低位,31H存结果高位 (4)AB123H-43ADCH= CLR C MOV A,#23H SUBB A,DCH MOV 30H,A MOV A,#0B1H SUBB A,#3AH MOV 31H,A MOV A,#0AH SUBB A,,#04H MOV 32H,A ;30H为低位,32H为高位 3、设有两个4位BCD码,分别存放在23H、22H单元和33H、32H单元中,求他们的和,并送入43H、42H单元中(低位在低字节,高位在高字节)。

答: MOV A ,22H ADD A ,32H MOV 42H ,A MOV A ,23H ADDC A ,33H MOV 43H ,A 4、略 5、编程计算片内RAM 区50H ~59H 单元中数的平均值,结果存放在5AH 中。 答: MOV R0,#8 MOV R1,#50H MOV A ,#00H L1: ADD A ,@R1 INC R1 DJNZ R0,L1 MOV B ,#8 DIV AB MOV 5AH ,A 6、编写计算下式的程序。设乘积和平方结果均小于255。a 、b 值分别存在片外3001H 和3002H 单元中,结果存于片外3000H 单元中。 (1)?? ???÷?=b a b a Y 25b a b a b a ><=,,, MOV DPTR ,#3001H MOVX A ,@DPTR MOV 30H ,A ;a 暂存30H 单元 INC DPL MOVX A ,@DPTR CJNE A ,30H ,L1 ;是否a=b MOV A ,#25 SJMP SAVE L1: JNC L2 MOV B ,30H MUL AB SJMP SAVE L2: MOV B ,A MOV A ,30H DIV AB SAVE: MOV DPTR ,#3000H MOVX @DPRT ,A (2)?? ???-++++=10)() (10)(222b a b a b a Y 10)(,10)(,10)(,222>+=+<+b a b a b a

第4章习题 汇编语言程序设计(单片机第二版)

第四章习题与参考答案 4.1程序设计语言有哪三种?各有什么异同?汇编语言有哪两类语言?各有什么特点? 4.2在汇编语言程序设计中,为什么要采用标号来表示地址?标号的构成原则是什么?使用标号有什么限制?注释段起什么作用? 4.3MCS-51汇编语言有哪几条常用伪指令?各起什么作用?

4.4汇编语言程序设计分哪几步?各步骤的任务是什么? 4.5汇编语言源程序的机器汇编过程是什么?第二次汇编的任务是什么? 4.6请用除法指令编写例4.2的程序,并计算所占内存字节数和所需机器周期数。 4.7设内部RAM20H单元有两个非零的BCD数,请编写求两个BCD数的积并把积送入21H单元的程序。 4.8已知,从内部RAM BLOCK单元开始存放有一组带符号数,数的个数存放在LED单元。请编写

可以统计其中正数和负数个数并分别存入NUM和NUM+1单元的程序。 4.9设自变量X为一无符号数,存放在内部RAM的VAX单元,函数Y存放在FUNC单元。请编写满足如下关系的程序: X>=50时:Y=X; 50>X>=20时:Y=5X; X<20时:Y=2X;

4.10在例4.6的128分支程序中,若用LJMP指令代替AJMP指令,以便分支程序可以放在64KB地址范围的任务位置。请修改原程序,修改后的程序最多可实现多少个分支? 4.11从外部RAM的SOUCE(二进制8位)开始有一数据块,该数据块以$字符结尾。请编写程序,

把它们传送到以内部RAM的DIST为起始地址的区域($字符也要传送)。 4.12在例4.11中,若SOUCE为二进制16位,则程序又该如何编。 4.13在外部RAM的低256地址单元区,有起始地址为SOUCE且长度存放在LEN单元的数据块。请编写能对它们进行奇偶校验的程序。凡满足奇校验(奇数个1)的数据均送到内部RAM起始地址为DIST 的存储区。

mcs-51第四章答案 汇编语言程序设计

第四章汇编语言程序设计 1 题若晶振为12MHz,试编制延时2ms和1s子程序。 答:延时2ms: DELY: MOV R7, #10 DLY0: MOV R6, #98 NOP DLY1: DJNZ R6, DLY1 DJNZ R7, DLY0 RET 延时1s: DELY: MOV R0, #50 LP11: MOV R1, #100 LP22: MOV R2, #100 LP33: DJNZ R2, LP33 DJNZ R1, LP22 DJNZ R0, LP11 RET 4 题试求20H和21H单元中16位带符号二进制补码数的绝对值,并送回20H和21H单元,高位在先,低位在后。 答:方法一: 先判断符号位,若为0则不作任何处理(因为正数的补码数与原数相同,而0的补码数就是0)。若符号位为1,则用0减去该数即可。编程如下: ORG 1000H MOV A, 20H JNB ACC.7, DONE CLR C CLR A SUBB A, 21H MOV 21H, A CLR A SUBB A, 20H MOV 20H, A DONE: SJMP $ END 方法二:可用变反加“1”来完成。

ORG 1000H MOV A, 20H JNB ACC.7, DONE CPL A MOV 20H, A MOV A, 21H CPL A MOV 21H, A CLR C MOV A, 21H ADD A, #1 MOV 21H, A MOV A, 20H ADDC A, #0 MOV 20H, A DONE: SJMP $ END 5题试求内部RAM 30~37H单元8个无符号数的算术平均值,结果存入38H单元。 答:方法一:相加后和放在R3:38H中,然后将结果整体右移3位,得数放在38H单元中。 ORG 1000H START: MOV R7, #07H MOV R3, #00H MOV A, 30H MOV R0, #31H LOOP: ADD A, @R0 JNC NEXT INC R3 NEXT: INC R0 DJNZ R7, LOOP MOV 38H, A MOV R7, #3 LOOP1: CLR C MOV A, R3 RRC A MOV R3, A

8086汇编语言复习题解答

8086/8088汇编语言习题解答 第一章 1.1、试根据自己使用计算机的经历,列举几个必须使用或最好是使用汇编 语言编制程序的事例。 1.2、试完成下列数制间的转换 ⑴、十进制数转换为8位二进制数 十进制:100 对应二进制:01100100B 十进制:56 对应二进制:00111000B 十进制:111 对应二进制:01101111B 十进制: 120 对应二进制:01111000B 十进制: 70 对应二进制:01000110B ⑵、8位二进制数(无符号数)转换为十进制数 二进制:01010101B 对应十进制:85 二进制:10101010B 对应十进制:170 二进制:11110000B 对应十进制:240 二进制:00001111B 对应十进制:15 ⑶、十进制数转换为十六进制数 十进制:40 对应二进制:00101000B 十进制:80 对应二进制:01010000B 十进制:105 对应二进制:01101001B 十进制: 114 对应二进制:01101101B 十进制: 207 对应二进制:11001111B

1.3、试把下面用补码表示的二进制数转换为对应的十进制真值 二进制补码:01111000 对应的十进制值数真值:+120 二进制补码:11011001 对应的十进制值数真值:-39 二进制补码:10000001 对应的十进制值数真值:-127 二进制补码:10001000 对应的十进制值数真值:-120 二进制补码:00100111 对应的十进制值数真值:+39 二进制补码:11110000 对应的十进制值数真值:-16 1.4、由键盘输入字符通常都是以该字符的ASCII码形式表示的。若现在从键盘上输入十六进制数0~F,那么应如何处理才能把十六进制转换为4位二进制数0000~1111. 答:将键盘输入的数0~F的ASCII码,每输入一个字符,减去30H后,再存入内存,这样就完成了把从键盘上输入的十六进制ASCII码转换为4位二进制数0000~1111. 1.5、试分别判断下列各组数据中哪个数据最大?哪个最小? ①、A=0.101B B=0,101D C=0,101H ②、A=1011B B=1011D C=1011H 答:第①组:A=1×21-+1×23-=0.625 B=0.101 C=1×161-+163-=0.0625+0.00024414=0.06274414 所以A最大,C最小 第②组,B最大,A=B最小 1.6、现有一个二进制数10110110.若将该数看着是无符号数、原码表示的带符号数、补码表示的带符号数,它对应的十进制数的真值是多少?

新版汇编语言程序的设计钱晓捷第4章习题答案

第4章基本汇编语言程序设计 〔习题4.1〕例题4.2如果要求算术右移8位,如何修改程序。 〔解答〕 思路:首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h到最高位字节;如为1,送ffh到最高位字节。传送可参考例题4.2,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成: .model small .stack 256 .data qvar dq 1234567887654321h .code .startup mov cx,7 mov si,1 again: mov al, byte ptr qvar[si] mov byte ptr qvar[si-1],al inc si loop again test al,80h jz ezz mov bl,0ffh jmp done ezz: mov bl,0 done: mov byte ptr qvar[7],bl .exit 0 end 〔习题4.2〕例题4.2如果要求算术左移7位,如何用移位指令实现。 〔解答〕 思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次,次低位字节至最高位字节依次带 CF 位循环左移一次(循环共8次),外循环体控制执行7次即可。 .model small .stack 256 .data qvar dq 1234567887654321h .code .startup mov dx, 7 ;外循环次数 mov ax, byte ptr qvar[0] ;最低位字节送ax lpp: shl ax,

第四章汇编语言

4.1汇编语言概述 语言分机器语言、低级语言、高级语言,机器语言由0和1构成,只有专业人士才能看懂。低级语言就是汇编语言,用助记符来表示,最贴近机器硬件,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言高级语言分为面向过程和面向对象的语言。 1 顺序结构 顺序程序设计,又叫直接程序设计。它是相对于分支程序和循环程序设计而言的。因此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也不重复执行某些指令,一直执行到最后一条指令为止。 2 分支结构 (1).分支程序设计概述 分支程序结构可以有两种形式,如图所示 (2)分支程序设计 分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。根据对条件的判断而选择不同的处理方法是人的基本智能体现。 3 循环程序设计 1.循环程序设计概述 有时我们会需要能按一定规律,多次重复执行的一串语句,这类程序叫循环程序。 循环程序一般由四个部分组成: (1)循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。循环初值分两类:一类是循环工作部分的初值,别一类是控制循环结束条件的初值。 (2)工作部分:即需要重复执行的程序段。这是循环的中心,称之为循环体。 (3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。 (4)控制部分:用来保证循环程序按规定的次数或特写条件正常循环。 4.2 汇编语言的语句 4.2.1语句分类:汇编语言语句分为指令性语句、伪指令、宏指令。 4.2.2语句格式:[标号] 操作码 [操作数] [注释] 汇编语言源程序中的每个语句可以由4项组成,格式如下 [name] operation operand [;comment] [名字项] 操作项操作数项;注释项 下面分别说明各项的表示方法。 1.名字项 源程序中用下列字符表示名字: 字母:A~Z或a~z; 数字:0~9; 专用字符号:?、?、@、―、$; 一般来讲,名字项可以是标号或变量。 (1)标号:在代码段定义,后面跟冒号:

有答案 14-15-1 汇编语言复习资料

汇编语言复习资料 第一部分选择题 第一章基础知识 1.数组array在数据段的定义如下所示,在内存空间的存储值是什么,选出正确的一 项(B ) array db 1,‘1’,0AH,‘A’,-2 A、1H 1H 0AH 0AH 82h B、1H 31H 0AH 41H FEH C、1 1 0A 0A 12h D、31H 31H 41H 41H 02h 2.debug命令中显示内存单元内容的命令是( B ) A、a B、d C、e D、r 3.debug命令中反汇编命令是(D ) A、q B、g C、t D、u 4.在DEBUG下,修改寄存器AX的命令是___B_。 A.U AX B.R AX C.R D.A AX 5.从200H开始反汇编的DEBUG命令是A____。 A.U 200 B.R 200 C.D 200 D.U 6.仅查看用户程序中数据段10号存储单元的DEBUG命令是A____。 A.D DS:A A B.D DS:A C.D DS:10 10 D.D DS:10 7.计算机编程语言的发展顺序是(A ) A、机器语言汇编语言高级语言 B、汇编语言机器语言高级语言 C、高级语言汇编语言机器语言 D、高级语言机器语言汇编语言 8.将124转换成十六进制数的结果是_A____。 A.7CH B.7DH C.7EH D.7BH 9.计算机对字符、符号采用统一的二进制编码。其编码采用的是_C_____。 A.BCD码B.二进制码C.ASCII D.十六进制码 第二章80x86计算机组织 10.对汇编语言源程序进行翻译的程序是__B___。 A.连接程序B.汇编程序C.编译程序D.目标程序 11.在汇编语言中,能够翻译成二进制代码的指令是__A__。 A.汇编指令B.伪指令C.机器指令D.宏指令

第四章--汇编语言程序设计

第四章汇编语言程序设计 1编程将片内40H?60H单元中的内容送到以3000H为首的存储区内。答:MOV R1,#40H MOV R2,#21H MOV DPTR,#3000H L1: MOV A,@R1 MOVX@DPT,R A INC R1 INC DPTR DJNZ R2,L1 2、编程计算下列算式的程序 1) 23H+45H+ABH+03H= MOV A , #23H ADD A , #45H ADD A , #0ABH XCH A ,B ;溢出处理 ADDC A , #00H XCH A ,B ADD A ,#03H;A中为结果低位,B中为高位 2) CDH+15H-38H-46H= MOV A,#0CDH ADD A,#15H SUBB A,#38H SUBB A,#46H 3) 1234H+8347H=

MOV A , #34H ADD A , #47H MOV 30H , A MOV A , #12H ADDC A , #83H MOV 31, A ;30H 存结果低位, 31H 存结果高位 4)AB123H-43ADCH= CLR C MOV A , #23H SUBB A , DCH MOV 30H , A MOV A , #0B1H SUBB A , #3AH MOV 31H , A MOV A , #0AH SUBB A ,, #04H MOV 32H , A ;30H 为低位, 32H 为高位 3、设有两个4位BCD 码,分别存放在 23H 22H 单元和33H 、32H 单元中,求他们的和,并 送入43H 、42H 单元中(低位在低字节,高位在高字节) 。 答: MOV A , 22H ADD A , 32H MOV 42H , A MOV A , 23H ADDC A , 33H MOV 43H , A

汇编语言第四章答案

4.1 指出下列指令的错误: (1) MOV AH, BX ;寄存器类型不匹配 (2) MOV [BX], [SI] ;不能都是存储器操作数 (3) MOV AX, [SI][DI] ;[SI]和[DI]不能一起使用 (4) MOV MYDA T [BX][SI], ES:AX ;AX寄存器不能使用段超越 (5) MOV BYTE PTR [BX], 1000 ;1000超过了一个字节的范围 (6) MOV BX, OFFSET MYDA T [SI] ;MYDA T [SI]已经是偏移地址,不能再使用OFFSET (7) MOV CS, AX ;CS不能用作目的寄存器 (8) MOV ECX, AX ;两个操作数的数据类型不同 答:见注释。 4.2 下面哪些指令是非法的?(假设OP1,OP2是已经用DB定义的变量) (1) CMP 15, BX ;错,立即数不能作为目的操作数 (2) CMP OP1, 25 (3) CMP OP1, OP2 ;错,不能都是存储器操作数 (4) CMP AX, OP1 ;错,类型不匹配,应为CMP ax, word ptr op1 答:见注释。 4.3 假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列哪些指令是非法的?它们的错误是什么? (1) MOV BP, AL ;错,寄存器类型不匹配 (2) MOV WORD_OP [BX+4*3][DI], SP (3) MOV WORD_OP1, WORD_OP2 ;错,不能都是存储器操作数 (4) MOV AX, WORD_OP1[DX] ;错,DX不能用于存储器寻址 (5) MOV SA VE_WORD, DS (6) MOV SP, SS:DA TA_WORD [BX][SI] (7) MOV [BX][SI], 2 ;错,[BX][SI]未指出数据类型 (8) MOV AX, WORD_OP1+WORD_OP2 (9) MOV AX, WORD_OP1-WORD_OP2+100 (10) MOV WORD_OP1, WORD_OP1-WORD_OP2 答:见注释。 4.4 假设V AR1和V AR2为字变量,LAB为标号,试指出下列指令的错误之处: (1) ADD V AR1, V AR2 ;不能都是存储器操作数 (2) SUB AL, V AR1 ;数据类型不匹配 (3) JMP LAB [SI] ;LAB是标号而不是变量名,后面不能加[SI] (4) JNZ V AR1 ;V AR1是变量而不是标号 (5) JMP NEAR LAB ;应使用NEAR PTR 答:见注释。 4.5 画图说明下列语句所分配的存储空间及初始化的数据值。 (1) BYTE_V AR DB ‘BYTE’,12,-12H,3 DUP(0,?,2 DUP(1,2),?) (2) WORD_V AR DW 5 DUP(0,1,2),?,-5,‘BY’,‘TE’,256H 答:答案如下图所示。 4.6 试列出各种方法,使汇编程序把5150H存入一个存储器字中(如:DW 5150H)。 4.5题答案 42H

第4章 课后习题与参考答案

第四章课后习题与参考答案 一、选择题 1.能将高级语言编写的源程序转换为目标程序的软件是() A、汇编程序 B、编辑程序 C、解释程序 D、编译程序 2.类和对象之间的关系是()。 A、定义和被定义的关系 B、调用和被调用的关系 C、类即是对象数组 D、抽象和具体的关系 3.下列是面向对象系统的特性的是()。 A、封装性 B、二义性 C、可重用性 D、完整性 4.计算机能直接执行的程序是()。 A、机器语言程序 B、汇编语言程序 C、高级语言程序 D、自然语言程序 5.下列高级语言中,能用于面向对象程序设计的语言是()。 A、C语言 B、C++语言 C、FORTRAN语言 D、Pascal语言 6.软件生存周期中的需求分析阶段的任务是确定()。 A、软件开发方法 B、软件开发工具 C、软件开发费用 D、软件开发系统的功能 7.程序设计语言所经历的主要阶段依次为()。 A、机器语言、高级语言和汇编语言 B、高级语言、机器语言和汇编语言 C、汇编语言、机器语言和高级语言 D、机器语言、汇编语言和高级语言 8.关于计算机软件叙述中正确的是()。 A、用户所编写的程序即为软件 B、源程序称为软件 C、软件包括程序和文档 D、数据及文档称为软件 9.下列叙述中,错误的是()。 A、计算机软件是指计算机中的程序和文档 B、软件就是程序 C、系统软件是应用程序与硬件间的接口 D、为课程管理开发的软件属于应用软件 10.一个栈的输入序列为1 2 3,则下列序列中不可能是栈的输出序列的是()。 A、2 3 1 B、3 2 1 C、3 1 2 D、1 2 3 11.在数据结构中,从逻辑上可以把数据结构分成()。 A、动态结构和静态结构则 B、线性结构和非线性结构 C、集合结构和非集合结构 D、树状结构和图状结构 12.在软件生存周期中,能准确确定软件系统必须做什么和必须具备哪些功能的阶段是()。 A、概要设计 B、详细设计 C、可行性分析 D、需求分析 13.软件测试的目的是()。 A、证明软件系统中存在错误 B、找出软件系统中存在的所有错误 C、尽可能多地发现系统中的错误和缺陷 D、证明软件的正确性 14.下面叙述正确的是()。 A、算法的执行效率与数据的存储结构无关 B、算法得空间复杂度是指算法程序中指令(或语句)的条数 C、算法得有穷性是指算法必须能在执行有限个步骤之后终止

chapter4汇编语言程序设计

第四章汇编语言程序设计 4-1 若晶振为12MHz,试编制延时2ms和1s子程序。 4-2 将20H单元中8位无符号数,转换成3为BCD码并存放在30H(百位)和31H(十位)单元中。 4-3 将30H单元内的2个BCD数相乘,乘积位BCD数,并把乘积存放在31H单元。 4-4 试求21H和20H单元中16位带符号二进制补数码的绝对值,并送回20H和21H单元,高位在先,低位在后 4-5 试求内部RAM30H~37H单元中8个无符号数的算术平均值,结果存入38H单元。 4-6 试编一数据块搬迁程序。将外部RAM2000H~204FH单元中的数,移入内部RAM30H~7FH 单元中。 4-7 在内部RAM的BLOCK开始的单元中有一无符号数据块,数据块长度存入LEN单元。试编程求其中的最小数并存入MINI单元。 4-8 在内部RAM的BLOCK开始的单元中有一带符号数据块其长度存入LEN单元。试编程求其中正数和负数的代数和,并分别存入PSUM与MSUM指向的单元中。 4-9 在内部RAM的BLOCK开始的单元中有一无符号数据块,其长度存入LEN单元。试编程重新按递增次序排列,并存入原存储区 4-10 试编程将(R2R3)中的二进制数转换成BCD码,并存入R0指向的单元中。用除以10次幂取商法编程。 4-11 试编程将R0指向的内部RAM中16个单元的32个十六进制数,转换成ASCII码并存入R1指向的内部RAM中。 4-12 在内部RAM的ONE和TWO单元各存有一带符号X和Y。试编程按下式要求运算,结果F存入FUNC单元。 X+Y 若X位正奇数 X∧Y 若X位正偶数 F= X∨Y 若X位负奇数 X+Y 若X位负偶数 X 若X等于零 4-13 设变量X存入VAR单元,函数F存入FUNC单元,试编程按下式要求给F赋值。 1 X>0 F= 0 X=0 -1 X<0

张雪兰等著汇编语言程序设计第3、4章习题答案

第三章习题答案 2.分别指出下列指令中源操作数和目的操作数的寻址方式。 ⑴MOV BX,12 ⑵MOV AL,128 ⑶MOV [BX],DX ⑷MOV DS,AX ⑸MOV V AR,8 ⑹MOV [1000H],DX ⑺MOV 6[BX],CX ⑻MOV AX,[BX][SI] ⑼MOV TAB[BP][DI],AL 答案: 3.在8086=0200H,(BP)=0100H,V AR的偏移量为0060H,请指出下列指令的目标操作数的寻址方式,若目标操作数为存储器操作数,请计算它们的物理地址是多少? ⑴MOV BX,12 ⑵MOV AL,128 ⑶MOV [BX],DX ⑷MOV ES:[SI],AX ⑸MOV V AR,8 ⑹MOV [1000H],DX ⑺MOV 6[BX],CX ⑻MOV [BX][SI],AX ⑼MOV 6[BP][SI],AL 答案: 4.设(DS)LAB 的偏移量为0060H,(20300H)=50H,(20301H)=01H,(20306H)=0BH,(20306H)=05H,试确定以下JMP指令转向的物理地址是多少? ⑴JMP BX ⑵JMP 6[BX] 答案: ⑴∵ (IP)=(BX)=0300H ∴转向的物理地址为12300H ⑵∵ (IP)=(DS:[BX+6])=(20306H)=050BH ∴转向的物理地址为1250BH 5.设(CS)=2000H,CS:0100H单元有一条JMP SHORT LAB指令,若其中的位移量为: ⑴60H ⑵80H ⑶0E0H 试写出转向目标的物理地址是多少? 答案: 因为CS:0100H处存放两字节指令,所以当执行该指令时(IP)=0102H

汇编语言题目答案-(4)

第4章自测练习 一、选择题(四选一) 1.设计子程序应该采用的一对伪指令是__C_________。 A segment/ends B start/end start C proc/endp D macro/endm 2.主程序将它的参数带给子程序,这个参数被称为 A 。 A 入口参数 B 出口参数 C 寄存器参数 D 存储器参数 3.对应主程序CALL指令调用子程序,子程序结束通常采用__D_______ 指令返回主程序。 A jmp B iret C hlt D ret 4.下面程序段条件转移语句发生跳转的条件是AL=___D_____ 。 cmp al,0fbh jnl next A 80h B 8fh C 0f0h D 0ffh 5.如下程序段中的“dec cx”指令执行了_C________ 次。 mov cx,4 jcxz next again:dec cx jnz again next:... A 0 B 1 C 4 D 5 二、填空题

1.程序的基本结构有顺序、分支、循环和子程序四种。 2.子程序可以通过__寄存器_、存储单元、(地址表)、_堆栈_等传递参数。 3.循环结构的程序通常由初始部分、循环体和循环控制三部分组成。 4.如果主程序调用与它处在同一个代码段的子程序,这是段内调用。 5.下面程序段完成将存储单元abcd1中一个压缩型BCD码拆成两个非压缩型BCD 码,高位BCD码存放在abcd3单元,低位BCD码存放在abcd2单元,再分别转换为对应的ASCⅡ码。请将程序补充完整: mov al,abcdl mov cl,4 shr al,cl Or al,30h mov abcd3,al mov al,abcdl and al, 0fh orl al,30h mov abcd2,al 6.在下述程序段的每一空框内填入一个语句,以实现如下功能:字节变量string中存放着一个字符串,以0DH为结束标志,求串长度并送字变量count中。 lea si,string mov al,0dh xor cx,cx goon:cmp al,[si]

微机控制技术第三章、第四章练习题答案

微机控制技术第三章、第四章练习题答案 第三章 3-1选择题 1、MOVX A,@DPTR指令中源操作数的寻址方式是(B) (A)寄存器寻址(B)寄存器间接寻址(C)直接寻址(D)立即寻址2.ORG 0003H LJMP 2000H ORG 000BH LJMP 3000H 当CPU响应外部中断0后,PC的值是(B) (A)0003H (B)2000H (C)000BH (D)3000H 3.执行PUSH ACC指令,MCS-51完成的操作是(A) (A)SP+1 SP (ACC)(SP)(B)(ACC)(SP)SP-1 SP (B)(C)SP-1 SP (ACC) (SP) (D)(ACC)(SP)SP+1 SP 4、LCALL指令操作码地址是2000H,执行完相子程序返回指令后,PC=(D) (C)2000H (B)2001H (C)2002H (D)2003H 5、51执行完MOV A,#08H后,PSW的一位被置位(D) (A)(A)C (B)F0 (C)OV (D)P 6、下面条指令将MCS-51的工作寄存器置成3区(B) (A)MOV PSW,#13H (B)MOV PSW,#18H (B)SETB CLR (d) SETB CLR 7、执行MOVX A,DPTR指令时,MCS-51产生的控制信号是(C) (D)/PSEN (B)ALE (C)/RD (D)/WR 8、MOV C,#00H的寻址方式是(A) (A)位寻址(B)直接寻址(C)立即寻址(D)寄存器寻址 9、ORG 0000H AJMP 0040H ORG 0040H MOV SP,#00H当执行完左边的程序后,PC的值是(C) (A)0040H (B)0041H (C)0042H (D)0043H 10、对程序存储器的读操作,只能使用(D)

第4章习题-汇编语言程序设计(单片机第二版)

第四章习题与参考答案 4.1 程序设计语言有哪三种?各有什么异同?汇编语言有哪两类语言?各有什么特点? 4.2 在汇编语言程序设计中,为什么要采用标号来表示地址?标号的构成原则是什么?使用标号有什么限制?注释段起什么作用? 4.3 MCS-51汇编语言有哪几条常用伪指令?各起什么作用?

4.4 汇编语言程序设计分哪几步?各步骤的任务是什么? 4.5 汇编语言源程序的机器汇编过程是什么?第二次汇编的任务是什么? 4.6 请用除法指令编写例4.2的程序,并计算所占内存字节数和所需机器周期数。 4.7 设内部RAM 20H 单元有两个非零的BCD数,请编写求两个BCD数的积并把积送入21H单元的程序。 4.8 已知,从内部RAM BLOCK单元开始存放有一组带符号数,数的个数存放在LED单元。请编写

可以统计其中正数和负数个数并分别存入NUM和NUM+1单元的程序。 4.9 设自变量X为一无符号数,存放在内部RAM的V AX单元,函数Y存放在FUNC单元。请编写满足如下关系的程序: X>=50时:Y=X; 50>X>=20时:Y=5X; X<20时:Y=2X;

4.10 在例4.6的128分支程序中,若用LJMP指令代替AJMP指令,以便分支程序可以放在64KB地址范围的任务位置。请修改原程序,修改后的程序最多可实现多少个分支? 4.11 从外部RAM的SOUCE(二进制8位)开始有一数据块,该数据块以$字符结尾。请编写程序,

把它们传送到以内部RAM的DIST为起始地址的区域($字符也要传送)。 4.12 在例4.11中,若SOUCE为二进制16位,则程序又该如何编。 4.13 在外部RAM的低256地址单元区,有起始地址为SOUCE且长度存放在LEN单元的数据块。请编写能对它们进行奇偶校验的程序。凡满足奇校验(奇数个1)的数据均送到内部RAM起始地址为DIST 的存储区。

相关文档
最新文档