文档库 最新最全的文档下载
当前位置:文档库 › 汇编语言之程序的基本结构

汇编语言之程序的基本结构

汇编语言之程序的基本结构
汇编语言之程序的基本结构

第6章程序的基本结构

在前面几章,我们分别介绍了用汇编语言进行程序设计所需要的几个最基本的知识:存单元的寻址方式,变量定义和各种汇编指令格式。在掌握了这些基本容之后,就需要学习如何把它们组成一个完整的汇编语言程序。

6.1 源程序的基本组成

汇编语言源程序的组成部分有:模块、段、子程序和宏等。一个模块对应一个目标文件,当开发较大型的应用程序时,该程序可能由若干个目标文件或库结合而成的。有关模块和子程序的知识和宏在第7章介绍,有关宏的知识将在第9章中叙述。

6.1.1 段的定义

微机系统的存是分段管理的,为了与之相对应,汇编语言源程序也分若干个段来构成。8086CPU有四个段寄存器,在该系统环境下运行的程序在某个时刻最多可访问四个段,而80386及其以后的CPU都含有六个段寄存器,于是,在这些系统环境下开发的运行程序在某个时刻最多可访问六个段。

不论程序在某个时刻最多能访问多少个段,在编程序时,程序员都可以定义比该段数更多的段。在通常情况下,一个段的长度不能超过64K,在80386及其以后系统的保护方式下,段基地址是32位,段的最大长度可达4G。

段的长度是指该段所占的字节数:

、如果段是数据段,则其长度是其所有变量所占字节数的总和;

、如果段是代码段,则其长度是其所有指令所占字节数的总和。

在定义段时,每个段都有一个段名。在取段名时,要取一个具有一定含义的段名。

段定义的一般格式如下:

段名 SEGMENT [对齐类型] [组合类型] [类别]

…;段的具体容

段名 ENDS

其中:“段名”必须是一个合法的标识符,前后二个段名要相同。可选项“对齐类型”、“组合类型”和“类别”的说明作用请见6.3节中的叙述。

一个数据段的定义例子:

DATA1 S EGMENT

word1 D W 1, 9078H, ?

byte1 D B 21, 'World'

DD 12345678H

DATA1 E NDS

一个代码段的例子:

CODE1 S EGMENT

MOV AX, DATA1 ;把数据段DATA1的段值送AX

MOV DS, AX ;把AX的值送给DS,即:DS存储数据段的段值

MOV AX, 4C00H

INT 21H ;调用DOS功能,结束程序的运行

CODE1 E NDS

6.1.2 段寄存器的说明语句

在汇编语言源程序中可以定义多个段,每个段都要与一个段寄存器建立一种对应关系。建立这种对应关系的说明语句格式如下:

ASSUME 段寄存器名:段名[, 段寄存器名:段名, ……]

其中:段寄存器是CS、DS、ES、SS、FS和GS,段名是在段定义语句说明时的段名。

在一条ASSUME语句中可建立多组段寄存器与段之间的关系,每种对应关系要用逗号分隔。例如,

ASSUME CS:CODE1, DS:DATA1

上面的语句说明了:CS对应于代码段CODE1,DS对应于数据段DATA1。

在ASSUME语句中,还可以用关键字NOTHING来说明某个段寄存器不与任何段相对应。下面语句说明了段寄存器ES不与某段相对应。

ASSUME ES:NOTHING

在通常情况下,代码段的第一条语句就是用ASSUME语句来说明段寄存器与段之间的对应关系。在代码段的其它位置,还可以用另一个ASSUME语句来改变前面ASSUME语句所说明的对应关系,这样,代码段中的指令就用最近的ASSUME 语句所建立的对应关系来确定指令中的有关信息。

例6.1 汇编语言段及其段说明语句的作用。

DATA1 S EGMENT

;定义数据段DATA1

word1 DW 5678h byte1 DB "ABCDEFG" DATA1 E NDS DATA2 S EGMENT

;定义数据段DATA2

word2 DW 1234h word3 DW 9876h DATA2 E NDS DATA3 S EGMENT

;定义数据段DATA3

byte2 DB ? DATA3 E NDS CODE1 S EGMENT

;编写代码段CODE1 ASSUME

CS:CODE1, DS:DATA1, ES:DATA2 ;(1) MOV AX, DATA1 ;(2) MOV DS, AX ;(3) MOV AX, DATA2 ;(4) MOV ES, AX ;(5)

MOV AX, word1 ;访问段DATA1中的字变量word1 MOV word2, AX ;访问段DATA2中的字变量word2 … ASSUME D S:DATA3, ES:NOTHING ;(6)

MOV AX, DATA3 MOV DS, AX

MOV

BL, byte2

;访问段DATA3中的字节变量byte2 …

MOV AX, 4C00H ;(7) INT 21H ;(8)

CODE1 ENDS

语句(1)和(6)分别说明了段和段寄存器之间的对应关系,其中语句(6)重新说明语句(1)所指定的对应关系。

二组语句(2)和(3)、(4)和(5)实现对段寄存器DS 和ES 赋初值。ASSUME 说明语句只起说明作用,它不会对段寄存器赋值,所以,必须对有关段寄存器赋值。在以后的其它源程序中也都是用此方法来实现对数据段寄存器赋值的。 语句(7)和(8)是调用中断21H 的4CH 号功能来结束本程序的执行,程序的返回代码由寄存器AL 来确定。结束本程序执行的指令是所有主模块必须书写的语句。

注意:代码段寄存器不能由程序员在源程序中对其赋值,其值是由操作系统在装入它进入系统运行时自动赋值的。

6.1.3 堆栈段的说明

堆栈段是一个特殊的段,在程序中可以定义它,也可以不定义。除了要生成COM型执行文件的源程序外,一个完整的源程序一般最好定义堆栈段。如果在程序中不定义堆栈段,那么,操作系统在装入该执行程序时将自动为其指定一个64K字节的堆栈段。

在程序没有定义堆栈段的情况下,在由连接程序生成执行文件时,将会产生一条如下的警告信息,但程序员可以不理会它,所生成的执行文件是可以正常运行的。

warning xxxx: no stack segment (其中:xxxx是错误号)

在源程序中,可用以下方法来定义堆栈段。

方法1:

STACK1 SEGMENT

DB 256 DUP(?) ;256是堆栈的长度,可根据需要进行改变

TOP LABEL WORD

STACK1 ENDS

以上堆栈段的定义如图6.1所示。由于堆栈是

按地址从大到小的存储单元顺序来存放容的,所以,

在堆栈存储单元说明语句之后,再说明一个栈顶别

名,这样,对栈顶寄存器SP的赋值就很方便。

在源程序的代码段中,还要添加如下程序段,

才能把段STACK1当作堆栈段来使用。

图6.1 堆栈段定义示意图…

ASSUME SS:STACK1 ;可在代码段的段指定语句中一起说明

CLI ;禁止响应可屏蔽中断

MOV AX, STACK1

MOV SS, AX

MOV SP, offset TOP ;给堆栈段的栈顶寄存器SP赋初值

STI ;恢复响应可屏蔽中断

方法2:

STACK1 SEGMENT STACK ;定义一个堆栈段,其段名为STACK1

DB 256 DUP(?)

STACK1 ENDS

上述段定义说明了该段是堆栈段,系统会自动把段寄存器SS和栈顶寄存器SP与该堆栈段之间建立相应的关系,并设置其初值,而不用在代码段对它们进行赋值。

除了以上二种方法外,还有一种更简洁的方法来定义堆栈段,有关容请见第6.4.2节中的叙述。

6.1.4 源程序的结构

下面的程序是一个完整的源程序,其功能是在屏幕上显示字符串“Hello, World.”。读者可参考此结构编写自己的简单程序。

例6.2 在屏幕上显示字符串“HELLO,WORLD.”

解:可运行下面的控件,用鼠标左键单击程序中的某一行,可阅读其含义;单击“存”可切换存容的显示方式。

伪指令END表示源程序到此为止,汇编程序对该语句之后的任何容都不作处理,所以,通常情况下,伪指令END是源程序的最后一条语句。

伪指令END后面可附带一个在程序中已定义的标号,由该标号指明程序的启动位置。

如果源程序是一个独立的程序或主模块,那么,伪指令END后面一定要附带一个标号;如果源程序仅是一个普通模块,那么,其END后面就一定不能附带标号。

6.2 程序的基本结构

在学习高级语言程序设计时,我们知道了程序的三大主要结构:顺序结构、分支结构和循环结构。在汇编语言的源程序也同样有此三大结构,所不同的是它们的表现形式不同。用高级语言编写程序时,由于不使用“转移语句”而使这三种结构清晰明了。

但在汇编语言的源程序中,很难不使用“转移语句”(除非是一些只有简单功能的程序),有时甚至会有各种各样的“转移语句”。由于存在这些转移语句,就使得:汇编语言源程序的基本结构显得不太明确。如果源程序的编写者思维混乱,编写出来的源程序在结构上就会显得杂乱无章,反之,如果编写者条理清晰,安排的操作井然有序,那么,编写出来的程序在结构上就会一目了然。

总之,不论是高级语言的源程序,还是汇编语言的源程序,其程序的三大基本结构也还是万变不离其宗的。

6.2.1 顺序结构

顺序结构是最简单的程序结构,程序的执行顺序就是指令的编写顺序,所以,安排指令的先后次序就显得至关重要。另外,在编程序时,还要妥善保存已得到的处理结果,为后面的进一步处理直接提供前面的处理结果,从而避免不必要的重复操作。

例6.3 编写程序段,完成下面公式的计算(其中:变量X和Y是32位有符号数,变量A,B和Z是16位有符号数)。

A←(X-Y+24)/Z的商,B←(X-Y+24)/Z的余数

解:

DATA1 S EGMENT

X DD ?

Y DD ?

Z DW ?

A DW ?

B DW ?

DATA1 E NDS

CODE1 S EGMENT

MOV AX, X

MOV DX, X+2 ;用(DX:AX)来保存32位变量X的数值

SUB AX,Y

SBB DX, Y+2 ;(DX:AX)-(Y+2:Y)

ADD AX, 24D

ADC DX, 0 ;(DX:AX)+24

IDIV Z

MOV A, AX

MOV B, DX

CODE1 E NDS

在编程序时,常常需要交换二变量之值。假设需要交换值的变量名为:var1和var2,临时增加的变量名为temp。常用的算法如下:

temp = var1

var1 = var2

var2 = temp

例6.4 假设有二个字变量word1和word2,编写程序段实现交换其值的功能。

解:

方法1:用汇编语言指令简单“直译”上面的交换数据方法

DATA1 S EGMENT

word1 D W ?

word2 D W ?

temp DW ?

DATA1 E NDS

CODE1 S EGMENT

MOV AX, word1

MOV temp, AX ;上二语句实现语句“temp=word1”

MOV AX, word2

MOV word1, AX ;上二语句实现语句“word1=word2”

MOV AX, temp

MOV word2, AX ;上二语句实现语句“word2=temp”

CODE1 E NDS

这种方法虽然也能完成功能,但显然其不能充分利用汇编语言的特点,程序效率很低。

方法2:用汇编语言指令的特点来直接编译

DATA1 S EGMENT

word1 D W ?

word2 D W ?

DATA1 E NDS

CODE1 S EGMENT

MOV AX, word1

XCHG AX, word2

MOV word1, AX ;能XCHG word1, word2来代替这三条指令吗?

CODE1 E NDS

该方法充分利用了汇编语言的特点,不仅省去了中间变量temp的定义,而且程序的效率也提高了。

6.2.2 分支结构

分支结构是一种非常重要的程序结构,也是实现程序功能选择所必要的程序结构。由于汇编语言需要书写转移指令来实现分支结构,而转移指令肯定会破坏程序的结构,所以,编写清晰的分支结构是掌握该结构的重点,也是用汇编语言编程的基本功。

在程序中,当需要进行逻辑分支时,可用每次分二支的方法来达到程序最终分多支的要求,也可是用地址表的方法来达到分多支的目的。

一、显示转移指令实现的分支结构

在高级语句中,分支结构一般用IF语句来实现,在汇编语言中,课用无条件转移指令或条件转移指令实现的分支结构。如图6.2给出了二种常用的分支结构。

在编写分支程序时,要尽可能避免编写“头重脚轻”的结构,即:当前分支条件成立时,将执行一系列指令,而条件不成立时,所执行的指令很少。这样就使后一个分支离分支点较远,有时甚至会遗忘编写后一分支程序。这种分支方式不仅不利于程序的阅读,而且也不便将来的维护。

所以,在编写分支结构时,一般先处理简单的分支,再处理较复杂的分支。对多分支的情况,也可遵循“由易到难”的原则。因为简单的分支只需要较少的指令就能处理完,一旦处理完这种情况后,在后面的编程过程中就可集中考虑如何处理复杂的分支。

(a) if … endif结构(b) if…else…endif结构

图6.2 分支结构的二种结构

例6.5 已知字节变量CHAR1,编写一程序段,把它由小写字母变成大写字母。

解:

DATA1 SEGMENT

CHAR1 DB ?

DATA1 ENDS

CODE1 SEGMENT

MOV AL, CHAR1

CMP AL, ‘a’

next

CMP AL, ‘z’

JA next

SUB CHAR1, 20H ;指令AND CHAR1, 0DFH也可以

next: …

CODE1 ENDS

例6.6 编写一程序段,计算下列函数值。其中:变量X和Y是有符号字变量。

解:

DATA1 SEGMENT

X DW ?

Y DW ?

DATA1 ENDS

CODE1 SEGMENT

MOV AX, X

CMP AX, 0

JGE case23

ADD AX, 10 ;第一种情况的计算结果

JMP result

case23: C MP AX, 10D

JG case3

MOV BX, 30D

IMUL BX ;第二种情况的计算结果

JMP result

case3: SUB AX, 9 ;第三种情况的计算结果

result: M OV Y, AX ;把计算结果保存到变量Y中

CODE1 ENDS

例6.7 把下列C语言的语句改写成等价的汇编语言程序段(不考虑运算过程中的溢出)。

If (a+b > 0 && c%2 == 0) a = 62;

else a = 21;

其中:变量a,b和c都是有符号的整型(int)变量。

解:

DATA1 SEGMENT

A DW ?

B DW ?

C DW ?

DATA1 ENDS

CODE1 SEGMENT

MOV AX, A

ADD AX, B

JLE _ELSE ;ADD指令会改变算术标志位

TEST C, 1 ;C%2==0,也就是:看C的最低位是否为0

JNZ _ELSE

MOV A, 62D

JMP NEXT

_ELSE: M OV A, 21D

NEXT: …

CODE1 ENDS

例6.8 用地址转移表实现下列C语言的switch语句,其中:变量A和B是有符号的整型(int)变量。

switch (a%8)

{case 0: b = 32; break;

case 1:

case 2: b = a + 43; break;

case b = 2*a; 解:

DATA1 SEGMENT

A DW ?

B DW ?

Table

DW case0. case12, case12,

case3

3: break;

case 4: b--; break;

case 5: case 6:

case 7: printf(“Function 5_6_7”);

break;

}

DW case4, case567, case567,

case567

MSG DB 'Function 5_6_7$'

DATA1 ENDS

CODE1 SEGMENT

MOV AX, A

MOV BX, AX

AND BX, 7

;得到BX的低三位,实现

a%8的计算

SHL BX, 1

;由于地址表是字类型,

其下标要乘2

JMP Table[BX]

;利用地址表实现多路转

case0: MOV B, 32D

JMP next

case12: ADD AX, 43D

MOV B, AX

JMP next

case3: SHL AX, 1

MOV B, AX

JMP next

case4: DEC B

JMP next

case567: L EA D X, MSG

MOV AH, 9

INT 21H

JMP next

next: …

CODE1 ENDS

用地址表实现多路转移的关键在于:转移入口的地址表和转移情况可整数化。如果这二个要求有一个不满足,或很难构造,则无法使用该方法。

为了改善汇编语言源程序的结构,减少显式转移语句所带来混乱,在宏汇编MASM 6.11系统中,增加了表达分支结构的伪指令。该伪指令的书写格式与高级

语言的书写方式相类似,汇编程序在汇编时会自动增加转移指令和相应的标号。理解并掌握该知识,对将来学习《编译原理》课程也有一定的帮助。

分支伪指令的具体格式如下:

格式1:

.IF condition ;以英文“句号”开头

指令序列 ;条件"condition"成立时所执行的指令序列.ENDIF

格式2:

.IF condition

指令序列1

.ELSE

指令序列2 ;条件"condition"不成立时所执行的指令序列.ENDIF

格式3:

.IF condition1

指令序列1

.ELSEIF condition2

指令序列2 ;条件"condition2"成立时所执行的指令序列.ENDIF

其中:条件表达式“condition”的书写方式与C语言中条件表达式的书写方式相似,也可用括号来组成复杂的条件表达式。

条件表达式中可用的操作符有:==(等于)、!=(不等)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、&(位操作与)、!(逻辑非)、&&(逻辑与)、||(逻辑或)等。

若在条件表达式中检测标志位的信息,则可以使用的符号名有:CARRY?(相当于CF==1)、OVERFLOW?(OF==1)、PARITY?(PF==1)、SIGN?(SF==1)、ZERO?(ZF==1)等。例如:

.IF CARRY? && AX != BX ;检测CF==1且AX!=BX是否成立;汇编语言指令序列

.ENDIF

在指令序列中,还可再含有其它的.IF伪指令,即:允许嵌套。伪指令.ELSEIF 引导出另一个二叉分支,但它不能作伪指令块的第一个伪指令。

汇编程序在对“条件表达式”进行代码转换时将进行代码优化处理,以便尽可能生成最好的指令代码。如:

.IF ax == 0

汇编程序会把它转换为指令“OR ax, ax”,而不是“CMP ax, 0”,因为前者比后者更好,而不是简单直接地转换为后者。

如果用伪指令来书写分支结构,那么,例6.5的代码段部分就可写成如下程序段:

MOV AL, CHAR1

.IF AL>='a' &&

;语句象C语言语句吗?

AL<='z'

SUB CHAR1, 20H

.ENDIF

也可把例6.6的代码段部分就可写成如下程序段:

MOV AX, X

.IF AX < 0

ADD AX, 10 ;计算第一种情况的结果

.ELSEIF AX <= 10

;计算第二种情况的结果

MOV BX, 30D

IMUL BX

.ELSE

SUB AX, 9 ;计算第三种情况的结果

.ENDIF

MOV Y, AX

;把计算结果保存到变量Y中

例6.9 根据当前计算机的时间和日期,显示上午(AM)或下午(PM),以及所在的季节。

解:显示解答

6.2.3 循环结构

循环结构是一个重要的程序结构,它具有重复执行某段程序的功能。通常,循环结构包括以下四个组成部分:

1、循环初始化部分——初始化循环控制变量、循环体所用到变量;

2、循环体部分——循环结构的主体;

3、循环调整部分——循环控制变量的修改、或循环终止条件的检查;

4、循环控制部分——程序执行的控制转移。

以上四部分可以在程序中用各种不同的形式体现出来,有时也并非清析地表达出来。常用的循环结构如图6.3所示。

(a)、Do—While结构(b)、While结构

图6.3 常用的循环结构示意图

一、用循环指令构成循环结构

在编写循环结构的程序片段时,我们可以多种方法来循环结构。如:循环次数是已知的,可用LOOP指令来构造循环;当循环次数是未知或不定的,则可用条件转移或无条件转移来构成循环结构。

例6.10 分类统计字数组data中正数、负数和零的个数,并分别存入存字变量Positive、Negative和Zero中,数组元素个数保存在其第一个字中。

解:显示解答

例6.11 计算数组score的平均整数,并存入存字变量Average中,数组以-1为结束标志。

解:

DATA1 SEGMENT

data DW 90, 95, 54, 65, 36, 78, 66, 0, 99, 50, -1

Average D W 0

DATA1 ENDS

CODE1 SEGMENT

ASSUME CS:CODE1, DS:DATA1

START: M OV AX, DATA1

MOV DS, AX

XOR AX, AX

XOR DX, DX ;用(DX,AX)来保存数组元素之和

XOR CX, CX ;用CX来保存数组元素个数

LEA SI, data ;用指针SI来访问整个数组

again: M OV BX, word ptr [SI]

CMP BX, 0

JL over

ADD AX, BX

ADC DX, 0 ;把当前数组元素之值加到(DX,AX)中

INC CX ;数组元素个数加1

ADD SI, 2

JMP again

over: JCXZ exit ;防止零作除数,即数组是空数组

DIV CX

MOV Average, AX

exit: MOV AX, 4C00H

INT 21H

CODE1 ENDS

END START

二、用伪指令实现的循环结构

在宏汇编MASM 6.11系统中,还增加了表达循环结构的伪指令,以便更清晰地表达WHILE循环、REPEAT-UNTIL循环。另外,还增加两个辅助循环的伪指令。这些伪指令的书写格式和含义与高级语言中相应语句的书写格式和含义相一致,所以,这些伪指令是很容易掌握的,也是非常有用的。

循环伪指令的格式和含义如下:

1、WHILE型循环伪指令

.WHILE condition

循环体的指令序列;条件"condition”成立时所执行的指令序列

.ENDW

其中:.ENDW与前面的.WHILE相匹配,它标志着其循环体到此结束。

如果条件表达式“condition”在循环开始时,就为“假”(false),那么,该循环体一次也不会被执行。

2、REPEAT型循环伪指令

.REPEAT

循环体的指令序列.REPEAT

循环体的指令序列

.UNTIL condition .UNTILCXZ [condition]

REPEAT型循环在执行完循环体后,才判定逻辑表达式condition的值。若该表达式的值为真,则终止该循环,并将执行伪指令.UNTIL[CXZ]后面的指令,否则,将向上跳转到伪指令.REPEAT之后的指令,为继续执行其循环体作准备。

如果.UNTILCXZ后面没有写逻辑表达式,那么,由.REPEAT-.UNTILCXZ所构成的循环与用LOOP指令所过程的循环是一致的,它们都是以“CX=0”为循环终止条件。

如果.UNTILCXZ后面书写了逻辑表达式,那么,该逻辑表达式的形式只能是:“EXP1==EXP2”或“EXP1!=EXP2”。所以,这时由“.RE PEAT-.UNTILCXZ condition”所构成的循环就与用LOOPNE/LOOPE指令所过程的循环是一致的,它们都是以“condition || CX=0”为循环终止条件。

和高级语言的REPEAT型的循环一样,.REPEAT-.UNTIL[CXZ]的循环体也会至少被执行一次。

.WHILE-.ENDW和.REPEAT-.UNTIL[CXZ]的循环体还可再含有循环伪指令,这样就构成了循环结构的嵌套。

汇编程序在生产指令代码时会进行代码优化,以便尽可能得到最优化的指令序列。

3、辅助循环伪指令

(1)、终止循环伪指令

.BREAK

.BREAK .IF condition

该伪指令用来终止包含它的最层循环。前者是无条件终止循环,后者是仅当逻辑表达式condition为真时,才终止循环。

.WHILE 1 .REPEAT

.BREAK .IF condition ……

.BREAK .IF condition …

ENDW .UNTIL 0

对于以上二个循环,如果没有指令来终止循环的话,它们都将进入死循环状态,但如果在该层循环体,存在伪指令“.BREAK .IF condition”的话,那么,当逻辑表达式condition为真时,该循环就会被终止了。

(2)、循环继续伪指令

.CONTINUE

.CONTINUE .IF condition

该伪指令用于直接跳转到包含它的最层循环的计算循环条件表达式的代码处。前者是无条件转移到计算循环条件表达式的代码处,后者是仅当条件表达式condition为真时,才进行这样的跳转。

辅助循环伪指令.BREAK和.CONTINUE只能在伪指令.WHILE-.ENDW

和.REPEAT-.UNTIL的循环体使用。

例6.12 显示9个数字字母'1'~'9',26个大写字母,和显示任意输入的数字字符,并用按“回车”键来结束本程序的运行。

解:

DATA1 SEGMENT

MSG1 DB 13, 10, "Iteration: "

NUM1 DB '1', "$"

MSG2 DB 13, 10, "Alphabet: $"

NUM2 DB 'A', " $"

MSG3 DB 13, 10, "Type digits, then press ENTER: $"

DATA1 ENDS

CODE1 SEGMENT

ASSUME CS:CODE1, DS:DATA1

START: M OV AX, DATA1

MOV DS, AX

MOV CX, 9

MOV AH, 09H

MOV DX, OFFSET MSG1

.REPEAT

INT 21H

INC NUM1

;显示Iteration: 1,2,~,9

.UNTILCXZ

MOV DX, OFFSET MSG2

INT 21H ;显示字符串"Alphabet:"

MOV AH, 09H

MOV DX, OFFSET NUM2

.REPEAT

INT 21H INC NUM2 ;显示当前字母;当前字母向后移

.UNTIL NUM2 > 'Z' ;显示整个大写字母表MOV AH, 09H

MOV DX, OFFSET MSG3

INT 21H

.WHILE 1 ;循环条件为永真的循环

MOV AH, 07H INT 21H ;不带回显地从键盘读一个字符 .BREAK .IF AL == 13 ;如果输入“回车”键,则终止循环 .CONTINUE .IF (AL<'0') || (AL>'9') ;如果字符不是数字字符,则继续循环 MOV DL, AL MOV AH, 02H INT 21H ;显示所输入的数字字母 .ENDW

MOV AX, 4C00H INT 21H CODE1 ENDS

END START

6.3 段的基本属性

在通常情况下,一个复杂的应用程序会由若干个模块组成,一个模块又会含有多个段。而不同模块的段之间、同一模块的段之间往往存在某种联系,这种联系就要体现在段属性的说明上。

段定义的一般格式如下:

段名 S EGMENT [对齐类型] [组合类型] [类别]

… 段名 E NDS

段属性“对齐类型”、“组合类型”和“类别”要按此顺序说明,但这些可选项可根据需要选择书写。如果源程序中不指定某个属性,那么,汇编程序将使用该属性的缺省值。

程序中的段名可以是唯一的,也可以与其它段同名。在同一模块中,如果有二个段同名,则后者被认为是前段的后续,这样,它们就属同一段。

当同一模块出现二个同名段时,则后者的可选项属性要么与前者相同,要么不写其属性而选用前者的段属性。

例6.13 同段名的作用 DATA1 SEGMENT ;第一个数据段

MSG DB "Hello, " DATA1 ENDS

CODE1 SEGMENT ;第一个代码段

ASSUME CS:CODE1, DS:DATA1 START: M OV AX, DATA1

MOV DS, AX

MOV DX, offset MSG

MOV AH, 9

INT 21H

CODE1 ENDS

DATA1 SEGMENT ;第二个数据段

DB "World.$"

DATA1 ENDS

CODE1 SEGMENT ;第二个代码段

MOV AX, 4C00H

INT 21H

CODE1 ENDS

END START

END

在上面的例子中,第二个数据段是第一个数据段的后续,汇编程序把它们是合二为一,上述的代码段也如此。

下面,详细说明段属性的含义及其作用。

6.3.1 对齐类型(ALIGN)

对齐类型表示当前段对起始地址的要求,连接程序(LINK.EXE)按表6.1的地址格式来定位段的起始地址。在进行段定位时,会根据其定位类型进行定位的,所以,各段之间就有可能出现一些空闲字节,即可能浪费几个字节单元。

段对齐类型PARA是一个适用于所有段类型的对齐类型,它也是缺省的对齐类型。对齐类型BYTE和WORD通常用于数据段的定位,对齐类型DWORD通常用于80386及其以后CPU代码段的定位。

表6.1 段对齐类型与段起始地址之间的对应关系

对齐类型起始地址(二进制) 功能说明

最多的空闲

字节数

BYTE xxxx xxxx xxxx xxxx

xxxx

下一个字

节地址

WORD xxxx xxxx xxxx xxxx

xxx0

下一个字

地址

1

DWORD xxxx xxxx xxxx xxxx

xx00

下一个双

字地址

3

PARA xxxx xxxx xxxx xxxx

0000

下一个节

地址

15

PAGE xxxx xxxx xxxx 0000

0000

下一个页

地址

127

6.3.2 组合类型(COMBINE)

组合类型是告诉连接程序如何把不同模块中段名相同的段合并在一起。具体的组合类型如下:

NONE 表示当前段在逻辑上独立于其它模块,并有其自己的基地址。

NONE是缺省的组合类型。

PUBLIC 表示当前段与其它模块中同段名的PUBLIC类型段组合成一个段。组合的先后次序取决于LINK程序中目标模块排列的次序。

在组合时,后续段的起始地址要按其对齐类型进行定位,所以,

同名段之间可能有间隔。

COMMON 表示当前段与其它模块中同名段重叠,也就是说,它们的起始地址相同。最终段的长度是同名段的最大长度。由于段覆盖,

所以,前一同名段中的初始化数据被后续段的初始数据覆盖掉。

STACK 组合类型STACK表示当前段是堆栈栈,其组合情况与PUBLIC

相同。

AT 数值表

该数值表达式是当前段所指定的绝对起始地址的段地址。

达式

6.3.3 类别(CLASS)

类别是一个由程序员指定的用单引号括起来的字符串。如果一个段没有给出类别,那么,这个段的类别就为空。类别是用于段的分类,连接程序利用该类别来调整同名、同类别的段,并使它们相邻。典型的类别是"Data"和"Code"。如果指定某段的类别是"Code",那么,该段最好是代码段,这样,有的调试程序(如:CodeView)就可以顺序工作。

例如:

DATA1 SEGMENT WORD PUBLIC "Data"

DATA1 ENDS

上述段定义说明了该段的起始地址是下一个字地址、组合类型为PUBLIC、段类别是"Data"。

6.3.4 段组(GROUP)

段组伪指令GROUP是用于把源程序模块中若干个段结合成一个组,并对该段组定义一个段组名。段组伪指令的格式如下:

段组名 GROUP 段名[, 段名, ……]

实验四-循环结构汇编语言程序的设计实验报告

循环结构汇编语言程序设计实验报告

实验四循环结构汇编语言程序设计 一、实验目的 1、学习循环结构的汇编语言程序的设计和调试。 2、学习通过直接对8086计算机的寄存器和存的直接访问,编写更高效简洁的汇编程序。 3、加深掌握计算机整体的工作过程。 3、加深对排序算法的理解。 二、实验任务 编写程序求出数组A中(20个元素)的最大值和最小值(数组没有排序)。 要求至少采用二种不同的排序算法来实现。( 快速排序,归并排序、堆排序、Shell排序、插入排序、冒泡排序、交换排序、选择排序、基数排序……) 三、实验容 为了更好地实现老师所布置的实验任务,我们根据情况选取以下两种方式实

验。 1、利用冒泡排序的方式求解数组A中元素的最大值最小值。设计流程图如 下所示: 2、利用选择排序的方式求得数组A中元素的序列。设计流程图如下所示:

四、实验环境 PC机: winXP/win7(32位)/win7(64位)+winxp 虚拟机 汇编工具:Masm.exe+Link.exe。 五、实验步骤 1)建立和生成的文件 (1)编写的源程序,源程序名为abc、扩展名为.asm (2)源程序经汇编程序Masm.exe汇编(翻译)后生成二进制目标程序,文件名为abc.obj (3)目标程序需要经Link.exe连接生成可执行程序,文件名为abc.exe 2)汇编环境 最基本的汇编环境只需要两个文件:Masm.exe和Link.exe。将这两个文件拷入到已经建好的文件夹(例如 huibian)中,并将文件夹huibian放在硬盘根

目录C :\>下 3)上机步骤 进入DOS窗口中执行。 4)调试程序 进入DEBUG后,调试程序 5)调试成功后重新汇编、连接并生成可执行代码 6)执行程序,并对运行结果截图。 利用冒泡排序求得数组A中元素的最大值最小值的实验结果如下图所示:(说明:输入数据为:13,0,59,900,587,1,657,234,34,48) 利用选择排序对数组A中元素排序得到的序列得实验结果如下图所示:(说明:输入数据为13,0,59,900,587,1,657,234,34,48)

【汇编语言程序设计】试题及答案合集

《汇编语言程序设计试题及答案》合集 汇编语言程序设计试题及答案 1.对于有符号的数来说,下列哪个值最大(D) A:0F8H B:11010011B C:82 D:123Q 2.下列有关汇编语言中标号的命名规则中,错误的是(D) A:通常由字母打头的字符、数字串组成 B:标号长度不能超过31个字符 C:?和$不能单独作为标号 D:.号不可位于标号首 3.8088/8086存储器分段,每个段不超过(D ) A.64K个字 B.32K个字节 C.1兆个字节 D.64K个字节 4.寻址指令MOV CX, [BX + DI + 20]使用的是哪一种寻址方式(B)A:寄存器寻址B:相对基址变址寻址 C:变址寻址D:基址变址寻址 5.若AX= - 15要得到AX=15应执行的指令是(A ) A.NEG AX B.NOT AX C.INC AX D.DEC AX 6.8086/8088系统执行传送指令MOV时( A) A.不影响标志位 B.影响DF方向标志 C.影响SF符号标志 D.影响CF进位标志 7.若要求一个操作数中的若干位维持不变,若干位置?1?,可以使用(B)A:NOT B:OR C:AND D:XOR 8.下列指令中段默认为堆栈段的是( C) A.MOV AX,[BX+SI+10] B.ADD AX,ES:[SI] C.SUB [BX],[BP][DI] D. MOV DX,[1000H] 9.关于8086/8088微机系列,下列说法哪个是正确的(D) A:一个存储单元由16个二进制位组成,简称字。

B:当存储一个字数据时,低字节放高地址位,高字节放低地址位。 C:在内存空间中,可以无限分配段,且段的大小不受限制。 D:段与段之间可以邻接,也可以重叠。 10.下列关于堆栈的说法,错误的是(D) A:以?先入后出?为原则。 B:栈区最高地址单元的前一个单元为栈底。 C:运行中SP寄存器动态跟踪栈顶位置。 D:压栈和弹出都是以字节为单位。 11.表示过程定义结束的伪指令是( A) A.ENDP B.ENDS C.END D.ENDM 12.BUF1 DB 3 DUP(0,2 DUP (1,2),3) COUNT EQU $-BUF1 符号COUNT等价的值是( B) A.6 B.18 C.16 D.9 13.下列标志位中,可以用来判断计算结果正负的是(B) A:PF B:SF C:DF D:OF 14.下列指令正确的是( CD) A. MOV [100H], [BX] B.MOV DS, ES C. ADD V[BX], CX D.MOV AX, 34H 15.下列哪个寄存器是属于指针寄存器(C) A:SI B:DX C:SP D:ES 二、填空题 (每小题4 分,共 20 分) 1.下列程序段求数组FLD的平均值,结果在AL中。请将程序填写完整(不考虑溢出) FLD DW 10, -20, 30, -60, -71, 80, 79, 56 _LEA SI,FLD______ MOV CX, 8 XOR AX, AX

汇编语言程序设计综合设计实验项目

汇编语言程序设计创新实验项目 1. 编写一个完整的程序:根据零件的数量和总价格,计算出零件的单价。 主程序MAINPRO允许用户在键盘上输入零件数量和总价格; 子程序SUBCONV 把从键盘输入的ASCII 码转化为二进制; 子程序SUBCALC 计算出零件的单价; 子程序SUBDISP 把二进制表示的单价转化为十进制数并显示出结果。 要求:在程序设计时要求使用顺序、分支、循环、子程序和宏汇编等多种方法解决程序设计问题,对于较大的子程序最好使用子程序嵌套,程序中如有多次重复的代码最好使用重复汇编。 2.编写一个完整的程序,分别输入有一个班学生的百分制成绩,根据学生百分制成绩转换出五级分数制。如低于60分为E,60-69为D、70-79为C、80-89为B、90-99为A。并统计该班学生人数。 要求:1、学生成绩从键盘接收; 2、本程序可以重复运行,自行设计退出程序的方法; 3、程序具有可操作性,如,应该有提示语句和判断非法操作的方法和处理方式。 3. 编写一个完整的程序,在屏幕上显示如图所示数字拼成的形状。 0123456789 1234567890 2345678901 3456789012 4567890123 5678901234 6789012345 7890123456 8901234567 9012345678 4、按要求编写一个完整的程序。 要求:1、自BUFFER开始的内存单元中,存有一个ASCII码字符串。查找已知字符串中含有多少个子字符串‘AB’的个数,将统计结果以十进制形式显示输出。 2、在查找到子字符串‘AB’后添加空格字符。 5、按要求编写一个完整的程序。 要求:1、编写子程序SORT,将内存中10个无符号字数据由小到大排序。 2、编写子程序FIND,在上述已排好的数据区里查找某一个数,若找到,显示 其在数据区的位置,否则显示‘N’字符。 3、编写调用程序,完成排序及检索任务。 6、试编写一程序,要求根据用户键入的月份在终端上显示该月的英文缩写名。 7、试编写一程序,要求接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,其中grade+1保存学号为了i+1的学生的成绩。然后根据grade中的学生成绩,把学生

汇编语言顺序结构程序设计

实验3 顺序结构程序设计 一、实验目的 学习数据传送指令和算术运算指令的用法;掌握数据定义伪指令的格式,会用DEBUG 中的D命令观察DB、DW、DD存储数据的格式;熟悉汇编语言的基本框架,掌握编写汇编语言程序的基本方法。 二、示例 源程序如下: data segment a d b 10 b db 20 d db 30,40,50 data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov al,d+1 add al,d mov a,al mov al,d+1 add al,d+2 mov b,al add d,10 add d+1,20 add d+2,30 exit: mov ah,4ch int 21h code ends end start

阅读程序,试问程序执行到exit时,字节单元a、b、d、d+1、d+2中的内容各是什么?(结合程序分析和实验实际结果截图) 结果:a:46 b:5A d:28 d+1:3C d+2:50 验证: 分析出结果,并上机验证。 三、实验题 求表达式Y=A*X2+B*X+C的值,已知a、b、d分别存放在dataa、datab、datad字节单元,X存放在TABLE字节单元,结果Y放入RESULT字单元。 要求:①在DEBUG下多次修改X的值,观察执行结果Y 四、实验报告 写出程序清单,记录运行结果;总结DEBUG中U、E、D、T、G命令的功能。 程序代码: data segment dataa db 1

datab db 3 datad db 5 table db 2 result dw? data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov al,table mul al mul dataa cbw mov bx,ax mov al,table mul datab add bx,ax mov al,datad cbw add bx,ax

实验一基础汇编语言程序设计

实验一基础汇编语言程序设计 实验目的 1.学习和了解TEC-XP十六位机监控命令的用法; 2.学习和了解TEC-XP十六位机的指令系统; 3.学习简单的TEC-XP十六位机汇编程序设计。 实验内容 1.使用监控程序的R命令显示/修改寄存器内容、D命令显示存储器内容、E命令修改存储器内容; 2.使用A命令写一小段汇编程序,U命令反汇编刚输入的程序,用G命令连续运行该程序,用T、P命令单步运行并观察程序单步执行情况。 3.学习联机使用TEC-XP教学试验系统和仿真终端软件。 实验要求 在使用该教学机之前,应先熟悉教学机的各个组成部分及其使用方法。 实验步骤 1.关闭电源,将大板上的COMl口与PC机的串口相连; 2.接通电源,在PC机上运行PCEC.EXE文件,设置所用PC机的串口为“l”或“2”,其它的设置一般不用改动,直接回车即可; 3.置控制开关为001110(连续、内存读指令、组合逻辑、16位、联机),开关拨向上方表示“1”,拨向下方表示“0”,“X”表示任意。其它实验相同; 4.按一下“RESET”按键,再按一下“START”’按键,主机上显示: 5.用R命令查看寄存器内容或修改寄存器的内容 1.用R命令查看寄存器或修改寄存器内容 1)在命令行提示符状态下输入: R↙;显示寄存器的内容 注:寄存器的内容在运行程序或执行命令后会发生变化。

2)在命令行提示符状态下输入: R R0↙;修改寄存器R0的内容,被修改的寄存器与所赋值之间可以无空格, 也可有—个或数个空格 主机显示: 寄存器原值:xxxx 在后面输入新的值0036 再用R命令显示寄存器内容,则R0的内容变为0036。 2.用D命令显示存储器内容 在命令行提示符状态下输入: D 2000↙ 会显示从2000H地址开始的连续128个字的内容; 连续使用不带参数的D命令,起始地址会自动加128(即80H)。

河北工业大学汇编语言程序设计实验

汇编语言程序设计实验 网络*** *** 实验一 顺序与分支程序设计 一 、实验目的 1) 掌握顺序程序设计方法。 2) 掌握分支程序的结构及分支程序的设计,调试方法。 2) 学习数据传送及算术和逻辑运算指令的用法。 3) 熟悉在pc 机上建立、汇编、连接、调试和运行汇编语言程序的过程。 二、实验内容 1.实验六 从键盘上接收一位十进制数x ,计算y 值,并以十六进制形式显示出来,y 按下列公式计算。 ???????===-=+=) 6(2/) 5()4(2)3(2222X X X X X X X X X X Y 2..实验七 实验内容:从键盘上接收两个一位十六进制数x 和y ,然后再输入一个a-d 之间的一个字符,按下列要求计算。 a) 当输入字符为a ,则计算x+y ,并以十六进 制形式显示出来 b) 当输入字符为b ,则计算|x-y|,并以十六进制形式显示出来 c) 当输入字符为c ,则计算x*y ,并以十六进制形式显示出来 d) 当输入字符为d ,则计算x/y ,并以十六进制形式显示出来 三、实验代码 实验六 DATE SEGMENT X DB ?

DATE ENDS ;数据段 CODE SEGMENT ASSUME CS:CODE,DS:DATE START:MOV AX,DATE ;代码段 MOV DS,AX ;初始化ds寄存器 MOV AH,1 INT 21H ;读文件到缓冲区 CMP AL,33H ;比较指令 JB L0 ;A

汇编语言程序设计

汇编语言程序设计 实验报告 实验名称上机过程及顺序结构与分支结构程序设计实验班级 学号 姓名 日期2017年10月26号 成绩 评阅人 软件学院

一、实验目的与意义 理解并熟练掌握汇编语言程序设计过程中的编辑、汇编、链接和调试等各个步骤,提高对汇编课程内容的理解和汇编语言的掌握,通过上机练习加深对课程内容的理解和掌握。通过汇编语言编制的程序上机调试、运行检验程序设计是否正确。熟悉和掌握编辑、汇编、连接和调试四个实用程序的使用方法,掌握调试程序中的几个常用命令的使用方法。熟悉其基本的指令操作,debug调试操作命令以及分支结构、顺序结构和循环结构的程序设计。 二、实验环境 操作系统:Microsoft Windows8 集成环境:Masm for Windows 上机地点:信息楼B405教室 三、实验的预习内容 预习的主要内容: 1. 使用DEBUG命令的方法; 2. 熟悉掌握从理论上定义数据的类型(即DB,DW,DD,); 3. 分支结构和顺序结构的步骤以及相关的指令; 4. 常用的标志位状态及相应的作用; 实验思路: 在对题目进行分析后,分析出解题方法,并做出与实验思路相对应的程序框图。依照程序框图的内容输入相对应的代码,最终在调试代码后,发现并解决一系列的汇编语言错误。进一步优化算法。实验之前必须了解十进制、十六进制和ASCII码之间的转换。预习查表法相关命令,掌握顺序程序的结构,从键盘输入数据的命令及显示到屏幕上的命令。 实验一: 题目1:将程序编辑、汇编、连接并通过集成环境中的debug调试,观察运行结果;用E命令修改指定地址的数据,再用G命令执行程序查看变化,用A 命令将加法指令修改成减法指令,再将其编译运行,查看寄存器值变化的异同。 题目2:分别用DB、DW和DD数据段9H,0FAH,41H,27H,编译链接之后生成exe文件,再用debug的r命令找到数据段地址,用d命令指定数据段地址,观察汇编后在机器内部对应的存储情况。 实验二: 先设置数据段地址和堆栈段地址;设置堆栈段指针;读取一个字符然后存储在AL中;用BX来存储AL中字符对应的数值;将BX中的值作为偏移地址;并在数据段中查找对应字符串;最终输出结果结束程序。 实验三: 先初始化数据段地址与堆栈段地址;设置堆栈段指针;然后将数据段中的data1放入AL中;读取数据段中的data2并判断data2是否大于0;然后读取数

8086汇编语言程序设计

实验1 简单汇编语言程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握简单汇编语言程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG 工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG 工具调试程序,验证程序的正确性。 1. 若X、Y、R、W 是存放8 位带符号数字节单元的地址,Z 是16 位字单元的 地址。试编写汇编程序,完成Z←((W-X) ÷5-Y)?(R+ 2) 。 2.试编写一个程序,测试某数是否是奇数。如该数是奇数,则把DL 的第0 位置1,否则将该位置0。 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验2 分支及循环程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握分支程序和循环程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。 2.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。参考加密方法是:每个数乘以2。(说明:本题的加密方法,同学们可以自己拟定) 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验3 子程序程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握子程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编程以十进制形式和十六进制形式显示AX的内容,并把两个显示功能分别封装成子程序dispDEC和dispHEX。 2.设在以EXAMSCORE为首地址的数据缓冲区依次存放某班10名同学5门功课的成绩,现要统计各位同学的总分,并将总分放在该学生单科成绩后的单元,并调用第1个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。请编程完成此功能。数据缓冲区参考数据定义如下: EXAMSCORE DB 01 ;学号 DB 89,76,54,77,99 ;单科成绩 DW ? ;该学生的总分 DB 02 ;学号 DB 79,88,64,97,92 ;单科成绩 DW ? ;该学生的总分 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

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

第四章MCS-51汇编语言程序设计 重点及难点: 单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。 教学基本要求: 1、掌握汇编语言程序设计的基本概念; 2、掌握伪指令的格式、功能和使用方法; 3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法; 4、掌握常用汇编语言程序设计步骤和方法。 教学内容 §4.1汇编语言程序设计概述 一、汇编语言的特点 (1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。 (2)使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。 (3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。 (4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。 二、汇编语言的语句格式 [<标号>]:<操作码> [<操作数>];[<注释>] 三、汇编语言程序设计的步骤与特点 (1)建立数学模型 (2)确定算法 (3)制定程序流程图 (4)确定数据结构 (5)写出源程序 (6)上机调试程序 §4.2伪指令 伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。 MCS- 51常见汇编语言程序中常用的伪指令:

第四章MCS-51汇编语言程序设计91 1.ORG (ORiGin)汇编起始地址命令 [<标号:>] ORG <地址> 2.END (END of assembly)汇编终止命令 [<标号:>] END [<表达式>] 3.EQU (EQUate)赋值命令 <字符名称> EQU <赋值项> 4.DB (Define Byte)定义字节命令 [<标号:>] DB <8位数表> 5.DW (Define Word)定义数据字命令 [<标号:>] DW <16位数表> 6.DS (Define Stonage )定义存储区命令 [<标号:>] DW <16位数表> 7.BIT位定义命令 <字符名称> BIT <位地址> 8.DA TA数据地址赋值命令 <字符名称> DATA <表达式> §4.3单片机汇编语言程序的基本结构形式 一、顺序程序 [例4-1]三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、5414和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。 MOV R0 ,# 52H ;被加数的低字节地址 MOV R1 ,# 55H ;加数的低字节地址 MOV A ,@ R0 ADD A ,@ R1 ;低字节相加 MOV @ R0 , A ;存低字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;中间字节带进位相加 MOV @ R0 , A ;存中间字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;高字节带进位相加 MOV @ R0 , A ;存高字节相加结果 CLR A

汇编语言程序设计

汇编语言程序设计 课程介绍 1.属于低级语言的程序设计 2.硬件类课程和操作系统先行课 3.软件开发的一个组成部分(加密解密、逆向工程、有害代码的分析防治) 4.高级语言程序设计的扩展(硬件资源的管理、驱动等) 5.对计算机专业:专业基础课、必修课 第一章汇编语言基础知识 §1.1计算机语言基本概念 一、机器语言:(0、1代码) 1.机器指令:是指挥计算机完成某一基本操作的命令,是由硬件电路设计决定的,也叫硬指令。由操作码和地址码组成。 2.指令系统:每台计算机所特有的、全部指令的集合构成该CPU的指令系统。 3.机器语言程序:机器指令的集合构成了机器语言,用机器语言编写的程序就是机器语言程序。 4.特点:计算机能直接识别,执行速度快,但难于记忆、识别和编写。 二、汇编语言: 1.汇编指令:用便于记忆、并能描述指令功能的符号表示的机器指令。 2.汇编程序:就是把汇编语言源程序翻译成机器语言程序的一种系统软件。 3.汇编语言:汇编指令、伪指令、宏指令和汇编程序一起组成了汇编语言。 4.特点:汇编指令与机器指令一一对应,相对机器语言易于理解、掌握。汇编语言直接面向机器,用汇编语言编制的程序简洁、快速。 三、高级语言:

1.高级语言:机器语言和汇编语言以外的程序设计语言统称高级语言。 2.特点:其特点是更加接近自然语言和惯用的数学表达形式,与计算机硬件结构无关,因而便于使用,便于交流和推广。高级语言编程效率高,但运行效率低。 3.高级语言需要使用编译程序和解释程序将源程序翻译成机器语言程序,然后交计算机执行。 §1.2数据表示与运算 一、位计数制: 1.位权表示法:每位的位权与该位的数值相乘后相加得到该数的数值。 2.十进制:逢十进一,用0、1、2、3、4、5、6、7、8、9十个数码表示。(D) 二进制:逢二进一,用0、1两个数码表示。(B) 八进制:逢八进一,用0、1、2、3、4、5、6、7八个数码表示。(Q) 十六进制:逢十六进一,用0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F十六个数码表示。(H) 二、不同数制之间的转化: 1.非十进制数转化为十进制: 1011100.1011B=1×26+0×25+1×24+1×23+1×22+0×21+0×20+1×2-1+0×2-2+1×2-3+1×2—4=92.6875D 1001.2Q=1×83+0×82+0×81+1×80+2×8-1 A031.2H=10×163+0×162+3×161+1×160+2×16-1=41009.125D 2.十进制转化为非十进制数: 十进制数转化位二进制数: 整数部分:除2取余,倒序排列得到的整数。 2 13 (1) 2 6 0

《汇编语言程序设计》考核方式

考核方式与要求 期末总成绩构成:期末开卷考试60% + 平时作业10% + 实验和实验报告30%。 1、试卷考核方式与要求 “汇编语言程序设计”的课程要求是使学生具有一定的程序设计能力。虽然课程是通过80x86微处理机来开展教学的,但学习的重点不仅仅是学会80x86指令的语法和规范,更重要的是通过多读程序、多练习编写程序来掌握程序设计的基本方法和技术,要求学生在工作中遇到其他机型,都应该能利用所掌握的方法和技术顺利解决实际问题。因此,我们在教学过程的各个环节,特别是具有指挥棒作用的考核环节中,着重体现了“能力培养是首位”的指导思想。 为此,汇编课一直实行多元化考核方式,在考核评分上,平时练习和上机实验占40%,期末考试占60%。期末考试实行开卷考试,这样学生平时学习的关注点就会放在分析问题和编程实现的方法上,有利于学生开阔思路,发挥自身创造力。每年设计开卷考试的考题是有一定难度的,教师必须非常熟悉课程的知识点、重点和难点,以及体现这些知识和能力水平的多种题目类型。 2、实验方式与要求 实验的目标为:加强课堂上相关理论和技术学习的有效性;提高学生上机编程和调试的能力;培养学生科学实践的理念和独立分析问题、解决问题的能力。其设计思想是:实验内容兼顾基础性和综合性,实验题目由简单→复杂,程序功能由单一→综合,实验安排有基本要求题+自选题,实验题类型有验证型和自主创新设计型。 √实验课组织形式: 1.系教学实验室按课程要求负责上机环境配置及实验设备管理; 2.以班为单位组织上机实验,并将上机时间安排表发至每位同学; 3.每单元实验课安排一位助教(助博)负责实验指导和答疑; 4.学生每做完一个实验即可提交老师验收,老师将实验运行结果记录下来作为实验成 绩的依据。验收时教师要注意发现比较突出的好的实验例题(完成时间短、程序运行效率高); 5.要求提交实验报告,根据实验报告及实验运行结果的记录,评出实验成绩,实验成 绩一般占总成绩的30%。 √教师指导方法: 1.大课集体指导。每学期实验前教师安排一次实验指导课,讲解实验方法和实验要求; 2.每次实验课都安排助教(助博)进行个别或集体的实验指导和答疑; 3.对具有共性的、问题比较多的实验,主讲教师在课堂上再进行集体指导; 4.每学期对实验中出现的问题,对照实验题目进行分析、总结,以利于以后的教学。 5.对于实验中有创新点的学生,还可以请他上讲台为同学们介绍他的设计思路,引发大家展开讨论。

实验2 顺序与分支汇编语言程序设计实验

ARM技术原理与应用 实验报告 实验2 顺序与分支汇编语言程序设计实验 专业电子信息工程 班级14电信班 学生姓名陈定光 学号2014010243101 指导教师曹计昌 2017年4月19 日

实验2 顺序与分支汇编语言程序设计实验 1、实验目的 (1)掌握顺序结构汇编语言程序设计; (2)掌握分支结构汇编语言程序设计; (3)掌握AXD环境下顺序结构和分支结构汇编语言程序的运行、调试。 2、实验要求 1、实验必须在在ADS1.2环境下进行。 2、工程名、汇编语言源文件名按照下面规则命名: 工程名:pj+学号最后4位+其它字符 汇编语言源文件名:p+学号最后4位+其它字符+.s 例如:张维智同学学号最后4位是3134 因此,pj3134、pj3134a、pj31341等都是允许的工程名;而 p3134a.s、p3134b.s等都是允许的源文件名。 3、实验报告中需要说明实验中在ADS、AXD环境下进行的实际操作; 4、实验报告中应给出实际的实验操作、编写的源程序、及计算机的调试观察结果; 5、按照规定格式打印实验报告。 3、实验内容 1、编写程序p2xxxx1.s完成下面任务: (1)将1、2、3、4、5、6、7、8依次传送给寄存器R1-R8; 分析:如上图显示,寄存器r1-r8分别是存放1-8 (2)用STMIA指令将R1-R8保存到刚好能够存储8个字数据ARY_A数组中。 分析:如上图显示,地址0x8058-0x8078分别存放1-8

(3)用STMIB指令将R1-R8保存到刚好能够存储8个字数据ARY_B数组中。 分析:如上图显示,地址0x8088-0x80A7分别存放1-8 (4)用STMDA指令将R1-R8保存到刚好能够存储8个字数据ARY_C数组中。 分析:如上图显示,地址0x8094-0x80B3分别存放1-8 (5)用STMDB指令将R1-R8保存到刚好能够存储8个字数据ARY_D数组中。

汇编语言习题与答案

汇编语言习题与答案 一、填空题:把答案填在题中横线上。 1.8位无符号整数的表示范围为0~255,写成16进制形式为00H~__________;8位有符号整数的表示范围为-128~+127,写成16进制形式为__________~__________。 2.8086/8088分段管理存储空间,但每段容量最大不超过__________。 3.逻辑地址为F000:100的存储单元,其物理地址是__________。 4.用来指示堆栈栈顶的偏移地址的是__________寄存器。 5.若要测试AL寄存器D4、D2、D0位是否都为0,则可使用__________指令语句(含操作数),以产生转移条件。这条指令执行后将利用标志位__________实现转移。 6.若定义:bdata db2dup(1,2,2dup(3),4),则dbata变量前5个单元从低地址到高地址的数据依次是__________。 7.假设varw是一个16位变量,则指令“mov varw,ax”的目的操作数的寻址方式是__________。 二、选择题:在每小题给出的四个选项中,只有一项是符合题目要求的,请把所选项前的字母填在题后的括号 内。 1.对汇编语言源程序进行翻译,形成OBJ文件的是 A.汇编程序 B.连接程序 C.编辑程序 D.调试程序[] 2.下列各个8位二进制数的补码中,真值最大的是 A.10001000 B.11111111 C.00000000 D.00000001[] 3.MASM语句中,表达常数不正确的形式是 A.01101001B B.A346H C.’A’ D.5600[] 4.如果SS=600H,则说明堆栈段物理地址起始于 A.60H B.600H C.6000H D.60000H[] 5.dw50dup(?)预留了存储空间的字节数是 A.25 B.50 C.100 D.200[] 6.下列指令中有操作数在代码段中的是 A.mov ax,34h B.add ax,bx C.inc word ptr[34h] D.cmp ax,[34h][] 7.假设AL=5,要使得AL=0FAH,应执行的指令是 A.not al B.and al,0fh C.xor al,0f0h D.or al,0fh[] 8.设置逻辑段应该采用的一对伪指令是 A.segment/ends B.start/end start C.proc/endp D.macro/endm[] 9.条件转移指令JNE条件是 A.CF=0 B.CF=1

汇编语言的编程步骤与调试方法

汇编语言的编程步骤与调试方法 一、汇编源程序的建立 1. 使用工具 (1)EDIT,记事本等文本编辑软件,编辑源程序,保存为.asm文 件; (2)ASM,MASM汇编程序,对源程序进行汇编,生成.obj文件- 目标文件,以及调试用.LST-列表文件和.CRF-交叉引用表; (3)Link连接程序,对使用的目标文件和库文件进行连接,生 成.exe文件,同时调试用.map-地址映像文件; 如果源程序无语法错误,上述三步将生成可运行的.exe文件, 如果运行结果无误,则完成对汇编程序的编程,如果运行后结果存 在错误,需要进行调试。 (4)Debug调试程序,对.exe文件进行调试,修改,直到程序正 确。 图3 目标程序生成步骤图2. 编程过程 (1)用文本编辑软件,编写扩展名为.asm的源文程序文件。 (2)用汇编程序对编好的源文件进行汇编。 命令行:masm [*.asm] ↙ 如果源文件中存在语法错误,则汇编程序将指出错误类型及位置,可根据这些信息重新编辑源文件,直至无语法错误,汇编后,将生成指定名称的目标文件.obj。 使用MASM50汇编程序进行汇编,输入命令行masm或者masm *.asm后,根据提示,输入文件名,在汇编没有错误的情况下,如屏幕所示:汇编程序可生成三个文件,*.obj,*.lst和*.crf。 *.obj-目标文件,用于连接生成可执行文件; *.lst-列表文件(可选),汇编语言汇编的机器语言与汇编语言对照表,可用于

调试; *.crf-交叉引用文件(可选),给出了用户定义的所有符号和对每个符号定义、引用的行号。 (3)目标文件的连接 命令行:link [*.obj] [*.obj] [*.lib] ↙ 连接程序,将多个目标程序及库文件,连接生成可执行的*.exe文件,同时可选择生成*.map文件。 *.map-地址映像文件,给出内存地址分配的有关信息。 下图所示屏幕,为Link连接两个目标文件,没有错误的情况下,生成*.exe 文件。 (4)执行程序 执行*.exe文件,观察程序运行结果,如果存在错误,需要进行调试。调试工具DEBUG是针对汇编语言程序设计的一种调试工具,熟练使用DEBUG有助于汇编语言程序员对于逻辑错误的调试。 二、汇编程序的调试

单片机汇编语言程序编程规范

引言 软件设计更多地是一种工程,而不是一种个人艺术。如果不统一编程规范,最终写出的程序,其可读性将较差,这不仅给代码的理解带来障碍,增加维护阶段的工作量,同时不规范的代码隐含错误的可能性也比较大。 分析表明,编码阶段产生的错误当中,语法错误大概占20%左右,而由于未严格检查软件逻辑导致的错误、函数(模块)之间接口错误及由于代码可理解度低导致优化维护阶段对代码的错误修改引起的错误则占了一半以上。 可见,提高软件质量必须降低编码阶段的错误率。如何有效降低编码阶段的错误呢?这需要制定详细的软件编程规范,并培训每一位程序员,最终的结果可以把编码阶段的错误降至10%左右,同时也降低了程序的测试费用,效果相当显著。 本文从代码的可维护性(可读性、可理解性、可修改性)、代码逻辑与效率、函数(模块)接口、可测试性四个方面阐述了软件编程规范,规范分成规则和建议两种,其中规则部分为强制执行项目,而建议部分则不作强制,可根据习惯取舍。 1.排版 规则1 程序块使用缩进方式,函数和标号使用空格缩进,程序段混合使用TAB和空格缩进。缩进的目的是使程序结构清晰,便于阅读和理解。 默认宽度应为8个空格,由于Word中为4个空格,为示范清晰,此处用2个代替(下同)。例如: MOV R1, #00H MOV R2, #00H MOV PMR, #PMRNORMAL MOV DPS, #FLAGDPTR MOV DPTR, #ADDREEPROM read1kloop: read1kpage: INC R1 MOVX A, @DPTR MOV SBUF, A JNB TI, $ CLR TI INC DPTR CJNE R1, #20H, read1kpage INC R2 MOV R1, #00H CPL WDI CJNE R2, #20H, read1kloop ;END OF EEPROM 规则2

汇编语言程序设计基本方法

第七章汇编语言程序设计基本方法1.教学目的:掌握微型汇编语言程序分析和设计方法 2.教学要求: ①熟悉汇编语言程序设计的基本步骤。 ②掌握程序流程图的使用,会利用其分析问题。 ③掌握汇编语言的顺序、分支、循环程序的设计。 ④了解实模式下80386及其后继机型的汇编语言的程序设计3.教学重点: ①利用流程图分析问题。 ②顺序、分支、循环程序的设计。 4.掌握难点: ①分支程序设计 ②循环程序设计 5.教学进程安排:P137~P168 6.教学方法: 课堂讲授 7.教学内容摘要: 7.1 汇编语言程序设计概述 7.1.1 汇编语言程序设计的基本步骤 1.分析问题,抽象出描述问题的数学模型 2.确定算法 3.绘制流程图 4.分配存储空间和工作单元 5.编写程序 6.静态检查 7.上机调试运行 7.1.2 程序流程图 1. 用自然语言表示算法 2. 流程图的组成 ⑴执行框(矩形框) ⑵判别框(菱形框) ⑶开始框和终止框 ⑷指向线 ⑸连接点 3. 三种基本结构和改进的流程图 ⑴传统流程图的弊端 ⑵三种基本结构 ①顺序结构 ②选择结构 ③循环结构

图7.4 顺序结构图图7.5 选择结构图 4. 结构化程序设计的特点 ⑴只有一个入口 ⑵只有一个出口 ⑶各功能框均可执行 ⑷结构中无死循环 7.2 顺序程序设计 顺序结构程序是最简单的程序,在顺序结构程序中,指令按照先后顺序一条条执行。 【例7-3】将—个字节压缩BCD码转换为两个ASCII码。 7.3 分支程序设计 7.3.1 分支程序的结构形式 分支程序结构可以有两种形式,如图7.6 (1) IF_THEN_ELSE结构 (2) CASE结构 7.3.2 分支程序设计方法 程序的分支一般用条件转移指令来产生,利用转移指令不影响条件码的特性,连续地使用条件转移指令使程序产生了多个不同的分支,而对于数组中的每一个数,它只能是多个分支中的某一个。 【例7-5】在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI 寄存器中,数组中的第一个单元存放着数组长度,在AX中有一个无符号数,要求在数组中查找(AX),如找到,则使CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF=1。 【例7-6】折半查找算法程序 7.3.3 跳跃表法

汇编语言完整题库

一.名词解释(本大题共5小题,每小题3分,共15分)试解释下列名词的含义。 1.逻辑地址 2.物理地址 3.标志寄存器 4.存储器寻址方式 5.补码 二.计算题(本大题共5小题,每小题4分,共20分)试按照各小题的要求给出计算结果。 1.将十进制数100分别转换为二进制、十六进制数,它们的表示形式分别为多少? 2.假设(DS)=0B00H,(BX)=0210H,对于指令MOV DS:120H[BX],AL,其目的操作数的物理地址为多少? 3.假设(BX)=0210H,(DI)=0060H,对于指令ADD DL,[BX][DI],其源操作数的偏移量为多少? 4.假设当前(SP)=0060H,连续执行5条PUSH指令后,(SP)=? 5.对于一个十进制数– 65,其二进制补码表示形式为多少? 三.排错题(本大题共4小题,每小题5分,共20分)每小题列出了一条指令,判断该指令有无语法错误,如果存在语法错误,请指出具体的错误原因,判断正确给2分,分析正确给3分,判断错误不给分。 1.PUSH 5588H 2.MOV DS,1720H 3.ADD AX,CL 4.AND AX,[DX] 四.程序分析题(本大题共6小题,每小题5分,共30分)每小题列出了一段小的程序片段和相关存储单元的初始值,请按题目的要求分析各程序片段的运行结果。(寄存器中的内容请使用十六进制形式给出) 1.阅读如下程序片段 MOV AL,4CH MOV BL,0B5H ADD AL,BL 执行上述程序片段后,(AL)= ,(BL)= , CF= ,OF= ,PF= . 2.阅读如下程序片段 MOV AL,0F3H MOV DL,0C4H ADD AL,DL AND AL,0FH 执行上述程序片段后,(AL)= ,(AF)= ,CF= ,OF= ,PF= . 3.阅读如下程序片段 MOV AL,7EH MOV CL,04H ROL AL,CL 执行上述程序片段后,(AL)= ,(CL)= , CF= ,OF= . 4.阅读如下程序片段 MOV AX,0632H MOV BX,0C202H SUB AX,BX INC AX 执行上述程序片段后,(AX)= ,(CF)= , OF= . 5.阅读如下程序片段,假设(DS)=0100H,字节单元(01024H)=56H,字节单元(01025H)=28H MOV BX,0024H LEA BX,[BX] OR BX,0 ADC BX,[BX] 执行上述程序片段后,(BX)= ,(CF)= , OF= . 6.阅读如下程序片段,假设(SP)=0064H MOV AX,0001H MOV BX,0002H PUSH AX PUSH BX POP CX POP BX 执行上述程序片段后,(AX)= ,(BX)= , (SP)= , 五.程序设计题(本大题共2小题,第一小题7分,第二小题8分,共15分) 1.试编写一程序片段,实现BL高4位与低4位相互交换(7分) 2.试编写一程序片段,不使用乘除法指令,实现((AX)*5+14)/ 2的功能(AX中的数据理解为补码)(8分)

汇编语言程序设计的实验环境及上机步骤

第1章汇编语言程序设计实验 1.1 汇编语言程序设计的实验环境及上机步骤 1.1.1 实验环境 汇编语言程序设计的实验环境如下。 1.硬件环境 微型计算机(Intel x86系列 CPU)1台。 2.软件环境 ·Windows 98/XP/Me/2000操作系统; ·任意一种文本编辑器(EDIT、NOTEPAD(记事本)、UltraEDIT等); ·汇编程序(MASM.EXE或TASM.EXE); ·链接程序(LINK.EXE或TLINK.EXE); ·调试程序(DEBUG.EXE或TD.EXE)。 本书建议文本编辑器使用EDIT或NOTEPAD,汇编程序使用MASM.EXE,链接程序使用LINK.EXE,调试程序使用TD.EXE。 1.1.2 上机步骤 汇编语言程序设计的实验2和实验3仅使用TD.EXE,关于TD.EXE的使用方法请参见附录B。下面介绍的上机实验步骤适用于除实验2和实验3的所有实验(包括硬件接口部分的全部实验)。 1.确定源程序的存放目录 建议源程序存放的目录名为ASM,并放在C盘或D盘的根目录下。如果没有创建过此目录,请用如下方法创建。 通过Windows的资源管理器找到C盘的根目录,在C盘的根目录窗口中单击右键,弹出的菜单中选择“新建”→“文件夹”,并把新建的文件夹命名为ASM。 请把MASM5文件夹下的所有文件及TD.EXE都复制到此目录中。 2.建立ASM源程序 建立*.ASM源程序可以使用记事本文本编辑器。注意:保存时扩展名必须ASM。设建立的源文件为HELLO.ASM 3.用MASM.EXE汇编源程序产生OBJ目标文件 源文件HELLO.ASM建立后,要使用汇编程序对源程序文件汇编,汇编后产生二进制的目标文件(.OBJ文件)。具体操作如下: 方法一:在Windows中操作 用资源管理器打开源程序目录C:\ASM,把HELLO.ASM拖到MASM.EXE程序图标上。 方法二:在DOS命令提示符窗口中操作 选择“开始”→“程序”→“附件”→“命令提示符”,打开DOS命令提示符窗口,然后用CD命令转到源程序目录下,接着输入MASM命令: I:>C:<回车> C:>CD\ASM<回车> C:\ASM>MASM HELL0.ASM<回车> 操作时的屏幕显示如图1所示。

相关文档
相关文档 最新文档