解:
(1)使AX寄存器的低4位清0,其余位不变。
AND AX, 0FFF0H
(2)使BX寄存器的低4位置1,其余位不变。
OR AX, 0FH
(3)测试AX的第0位和第4位,两位都是1时将AL清0。
TEST AX,01H JZ AA
TEST AX,10H JZ AA MOV AL,0 HLT AA: ......
(4)测试AX的第0位和第4位,两位中有一个为1时将AL清0。
解:TEST AX, 11H
JZ AA MOV AL,0 AA: .......
15. 编写程序段,完成把AX中的16进制数转换为ASCII码,并将对应的ASCII码依次存入MEM开始的存储单元中。例如,当AX的内容为37B6H时,MEM开始的4 个单元的内容依次为33H,37H,42H,36H。 解:
MOV CX,4 LEA SI,MEM ADD SI,3 ;SI指向MEM+3 CC: MOV BX,AX ;保存原始数据
AND AX, 000FH ;取个位数 CMP AL, 9 JA AA ;在A~B之间就加37H ADD AL,30H ;在0~9之间就加30H JMP BB AA: ADD AL,37H BB: MOV [SI],AL ;保存ASCII值
DEC SI PUSH CX MOV AX,BX MOV CL,4
SHR AX,CL ;准备取下一个数 POP CX LOOP CC
16. 编写程序段,求从TABLE开始的10个无符号数的和,结果放在SUM单元中。
解:
NEXT:
LEA SI,TABLE
MOV CX,10 XOR AX,AX ADD AL,[SI] ADC AH,0 INC SI
LOOP NEXT MOV SUM,AX
17. 编写程序段,从键盘上输入字符串‘HELLO’,并在串尾加结束标志‘$’。
解:LEA DX,STRING ;设置字符串存放缓冲区首地址 MOV AH ,0AH ;调用10号功能,输入字符串 INT 21H
MOV CL,STRING+l ;实际键入的字符个数送CL XOR CH,CH
ADD DX, 2
ADD DX,CX ;得到字符串尾地址 MOV BX,DX MOV BYTE PTR[BX],'$'
18. 编写程序段,在屏幕上依次显示1、2、3、A、B、C。
解: LEA BX,STR MOV CX,6 LPP: MOV AH,2 MOV DL,[BX] INC BX INT 21H LOOP LPP
;STR为6个字符的存放区域首地址
;利用2号功能调用依次先生6个字符
19. 编写程序段,在屏幕上显示字符串“Hello World”。
解: LEA DX,STRING ; STRING字符的存放区域首地址 MOV AH,09H INT 21H ; 利用9号功能调用显示字符串
20. 编写程序段,把内存中首地址为MEM1的200个字节送到首地址为MEM2的区域。
解:MOV AX,SEG MEM1
MOV DS,AX ;设定源串段地址 MOV AX,SEG MEM2 MOV ES,AX ;设定目标串段地址 MOV SI,0 ;设定源串偏移地址 MOV DI,0 ;设定目标串偏移地址
MOV CX,200 ;串长度送CX CLD ;(DF)=0,使地址指针按增量方向修改 REP MOVSB ;每次传送一个字节,并自动 HLT
21. 编写程序段,以4000H为起始地址的32个单元中存有32个有符号数,统计其中
负数的个数,并将统计结果保存在BUFFER单元中。
解:START: MOV DI,OFFSET BUFFER XOR AL,AL MOV [DI],AL MOV SI,4000H MOV CX,32 AA: MOV AL,[SI] OR AL,AL JNS X1 INC [DI] X1: INC SI NEXT: LOOP AA HLT
第4章 汇编语言及其程序设计
4.1 知识要点
用汇编语言编写的程序称为汇编语言源程序。汇编语言源程序必须经过具有“翻译”功能的系统程序的处理。汇编程序(Assembler)就是处理汇编语言源程序的系统程序,处理的过程称为汇编。源程序经过汇编生成机器语言目标程序,简称目标程序。目标程序经过连接程序连接,就得到可执行文件。
汇编语言源程序由若干段组成:数据段、附件数据段、堆栈段和代码段等,段与段之间的顺序可以随意排列,每一段由SEGMENT开始,以ENDS结束,每段的开始和结束都附有相同的名字。一个程序一般定义三个段:数据段、堆栈段和代码段,必要时增加定义附加数据段,能独立运行的程序至少包含一个代码段。
源程序中的语句有两种:指示性语句和指令性语句。指令性语句是可执行语句,是8088/8086CPU可以执行的的指令。
汇编语言语句中的操作数可以是寄存器、存储器单元、常量、变量、名字、标号和表达式。
1. 伪指令
汇编语言中的指示性语句也称为伪指令。伪指令的作用是告诉汇编程序如何对汇编语言源程序进行汇编,比如如何分段、程序处理的数据在哪里,子程序在哪等等。伪指令由汇编程序处理,不生成目标代码,不参与程序的执行。
1) 段定义伪指令SEGMENT和ENDS 2) ASSUME伪指令
3) 数据定义伪指令也称为变量定义伪指令,或存储单元分配伪指令。它用来定义
变量、确定变量的类型、给变量赋初值、为变量分配存储空间等。 4) 符号定义伪指令也称为赋值伪指令。在程序中有时会多次出现同一个数值或表
达式,通常可以用赋值伪指令将其赋给一个符号,程序中凡是用到该数值或表达式的地方都用这个符号代替,这样既提高了程序的可读性又使程序易于修改。有2条符号定义伪指令:EQU和= 5) 过程定义伪指令也称为子程序定义伪指令。在程序中常常有一些功能相对独立
的程序段重复出现,通常将它定义为过程或称为子程序,在程序中需要这种功能时只要使用调用命令CALL调用它就可以了。
6) 程序结束伪指令告诉汇编程序MASM源程序到此结束,并附带说明程序从哪
开始执行。
2. DOS系统功能调用
DOS操作系统为用户提供的系统功能调用有两种,一种称为BIOS功能调用,也叫低级调用,调用它们可以驱动磁盘、控制显示器输出、驱动打印机和管理时钟;另一种称为DOS功能调用,也叫高级调用,调用它们可以管理内存、管理设备、管理文件和目录。8088/8086微机系统中21H号中断被称为DOS系统功能调用,它的内部提供了八十多个功能子程序,可以实现字符输入、字符显示和打印、磁盘读写、文件建立打开关闭、文件读写等功能,基本上满足了普通程序员的编程需要。为了调用方便,系统对这些功能子程序顺序编号,称为功能号。调用的步骤如下:
① 把要调用的功能号送AH寄存器 ② 根据调用要求设置入口参数 ③ INT 21H
3. 汇编语言程序设计基础 顺序结构是最基本、最简单的程序结构。程序中的指令从开始到结束一条接一条顺序执行,没有分支也没有循环,指令的存储顺序与执行顺序一致。顺序程序只能实现相对简单的功能。
分支程序:根据条件是否成立执行不同程序段的程序结构称为分支程序。分支程序结构又分为简单分支结构和多分支结构两种形式。
一般用条件转移指令实现简单分支程序设计。汇编语言语句功能简单,多分支程序是简单分支的嵌套。
循环程序设计:循环程序结构由循环初始化、循环体和循环控制三部分组成。程序在循环控制下重复执行循环体,使计算机完成一系列的重复操作。循环程序结构有两种:先执行后判断和先判断后执行。
① 循环初始化,用来设置循环初始值,包括设置循环计数器初值、设置地址指针首地址和初始数据等。
② 循环体,是循环的主体,包括循环要完成的具体操作和修改循环参数,如地址指针修改、计数值的修改。
③循环控制,测试循环条件,判断是否继续循环,使循环能在有限的次数后结束。在循环次数确定的情况下,可用循环次数作为控制条件,这时常用LOOP指令实现控制循环。
过程又称为子程序。子程序使程序结构模块化,程序更加清晰、易读易懂。如果在一个