1、成人函授教育汇编语言程序设计自学指导书适用计算机专业、 函授本(专)科 黑龙江科技学院成教院1目 录一、前 言.2二、自学进度表4三、各章节自学指导参考5第一章 汇编语言基础知识 .5第二章 8086 指令系统 7第三章 汇编语言程序格式.11第四章 汇编语言程序设计.18第五章 32 位指令及其编程25第六章 汇编语言与 C/C+的混合编程31四、汇编语言自测试题322一、前言1、本课程的性质和任务汇编语言程序设计是计算机及电子信息类有关专业一门重要的基础课程,是计算机专业学生必修的核心课程之一。 汇编语言程序设计是培养学生直接使用计算机硬件资源能力的一门课程。它不仅能够帮助学生进一步理解计
2、算机组成原理课程中的各种概念,而且还为其它课程如:操作系统、接口与通信技术和计算机控制技术等课程提供必要的预备知识。该课程在计算机学科课程设置中起着承上启下的作用。本课程的主要任务:(1)、了解计算机内部硬件结构及一般工作原理。(2)、掌握 8086/8088 指令系统和汇编语言程序格式。(3)、掌握汇编语言程序设计的方法和调试技术。(4)、熟悉 BIOS 和 DOS 中断及其简单的控制应用(5)、在实际应用的接口电路中,会编写简单的汇编语言程序。2、本课程的自学方法(1) 针对函授学员面授时间短,答疑不便,主要靠自学等特点,为了使学员自学过程有依据,因此编了自学指导书。课程教学重点环节,在课
3、堂上主要是介绍各种常用指令格式和操作方法以及如何利用这些指令进行简单的程序设计。在每节授课过程中,首先提示本节应掌握的重点内容,然后在进一步讲解、做具体的说明。使学员能够真正掌握每一种指令的操作方法和应用。(2) 按照汇编语言程序设计课程教学大纲的要求,课程的讲授将从基础知识、寻址方式、基本指令系统、汇编语言程序格式、汇编语言程序设计(顺序、分支和循环等) ,从简单到复杂,循序渐进,逐步深入。 (3) 学好一门课程,教师的引导固然十分重要,但主要靠学员的自身努力。课堂教学可以起到画龙点睛的作用,但只有不断练习,才能巩固、掌握课程3的内容。因此,本课程要求学员积极独立完成所布置的习题。3、主要教
4、学环节考试说明:(1) 在教学大纲和考核说明所规定的知识范围内命题。在教学知识范围之内,需要灵活运用才能够解决问题的试题不属于超纲。(2) 试题的考察要求覆盖面广、区分度高。(3) 试题兼顾各个能力层次,理解占 40%,简单运用占 40%,综合运用占20%。(4) 试题的难易程度和题量适当,按难易程度分为四个层次:容易占 25%,较易占 35%,较难占 25%,难占 15%。题量安排以平时能够独立完成作业者,使他们能在规定的考试时间内做完并有一定时间检查为原则。本课程使用的教材为:汇编语言程序设计钱晓捷 电子工业出版社 2000 年 1 月出版。适用专业层次:专科、本科。在自学过程中,学员应根
5、据自学进度表和个章节所规定的内容,要求来预习,要求重点部分能弄清楚,并能看懂例题,做习题,难点部分做一般性了解,待面授时由任课教师详解,自学内容应在面授该内容之前完成。4二、自学进度表自学进度要求周次 预习重点 自学各章节内容自学时数面授时数备注1基础知识、8086 寄存器组、8086 的寻址方式第 1 章汇编语言基础知识第 2 章 8086 指令系统 2.1、2.24 42数据传送指令、算术运算指令位操作指令、串操作指令、控制移位指令第 2 章 8086 指令系统2.3、2.4、2.5、2.6、2.7、2.87 73实验:汇编语言程序实验的基本方法和指令系统、汇编语言程序格式第 3 章汇编语
6、言程序格式 7 74顺序、分支、循环、子程序程序设计、宏结构设计、输入输出程序设计第 4 章汇编语言程序设计 7 75实验:循环、分支程序设计,子程序设计,32 位指令运行环境和扩展指令第 5 章 32 位指令及其编程 7 76 Turbo C 嵌入汇编方式Turbo C 模块连接方式第 6 章汇编语言与 C/C+的混合编程4 47 实验 4 45三、各章节自学指导参考第一章汇编语言基础知识1、教学内容计算机的系统概述、数据表示、Intel 8086 系列微处理器、PC 微型计算机系统2、教学要求了解:微机及 PC 机系统的基本软硬件组成、掌握:数据的表示方法,有符号数的表示方法。掌握:熟悉汇
7、编语言的概念和应用特点、复习掌握数据表达 3、习题与解答(1)数制转换降幂法:首先写出要转换的十进制数,其次写出所有小于此数的各位二进制权值,然后用要转换的十进制数减去与它最相近的二进制权值,如够减则减去并在相应位记以 1;如果不够减则在相应位记 0 并跳过此位;如此不断反复,直到该数为 0 为止。除法:把要转换的十进制数的整数部分不断除以 2,并记下余数,直到商为 0 为止;对于小数部分则应不断乘以 2,并记下其整数部分,直到结果的小数部分为 0 为止。例 1:N=117D 计算它对应二进制数形式【解答】方法一、降幂法小于 N 的二进制权为:64 32 16 8 4 2 1 计算过程:117
8、-2 (a 1)5364176653-2 (a 1)25 521-2 (a )5 4(a )035-2 (a )14212(a )61-2 (a )01010所以 N=117D=1110101B方法二、除法过程: 117/2=58 (a )058/2=29 (a )129/2=14 (a )214/2=7 (a )37/2=3 (a )43/2=1 (a 1)51/2=0 (a 1)6(2)数的补码表示正数的补码等于它本身负数的补码:负数 (n 为位数)|2负 数补 码 n或者把该负数对应的正数的补码按位取反,末尾加 1例 2:机器字长 16 位,写出 N=-117D 的补码表示。【解答】+1
9、17D 可以表示为 0000 0000 0111 0101按位取反后为 1111 1111 1000 1010末尾加 1 为 1111 1111 1000 1011用十六进制数表示为 F F 8 B即-117D 的补码为 FF8BH(一)计算机硬件由中央处理器 CPU、存储器和输入/输出子系统组成,用系统总线把它们连接在一起。I/O子系 统中央处理器CPU总线控制逻辑存储器接口接口大容量存储器I/O 设备7第二章8086 指令系统1、教学内容:8086 的寄存器组、8086 的寻址方式、数据传送指令、算术运算指令、位操作类指令、串操作类指令、控制转移类指令、处理机控制类指令。2、教学要求:掌握
10、 8086 的寄存器组和存储器组织,掌握 8086 的寻址方式,熟悉 8086的基本参数、堆栈工作原理、指令对标志的影响、符号扩展的含义、压缩和非压缩 BCD 的格式,串操作寻址特点 掌握基本指令:MOV XCHGXLAT、PUSHPOP、LEA;CLCSTCSTC、CLDSTD;ADD ADCINC、SUBSBB DECCMPNEG、CBWCWD;ANDOR XORNOTTEST、SHLSHRSAR 、ROLRORRCL RCR;REP 、MOVSLODSSTOS;JMP Jcc 、JCXZLOOP、CALL RET、INT n 熟悉特色指令:INOUT ;CLI STI;MULIMUL、D
11、IV IDIV、DAA DAS、AAA AAS ;CMPSSCAS ;IRET ;NOP 了解不常使用的指令:LAHF SAHFPUSHF POPF、LDSLES;AAMAAD ;REPZ REPNZ;LOOPZLOOPNZ;INTO;LOCKHLT ESC WAIT 掌握 DOS、了解 ROM-BIOS 的字符字符串输入输出功能调用方法 掌握 DEBUG 调试程序的使用及调试指令和程序段的方法 3、习题与解答:(1)掌握七种寻址方式1、立即寻址方式2、寄存器寻址方式3、直接寻址方式4、寄存器间接寻址方式5、寄存器相对寻址方式6、基址变址寻址方式87、相对基址变址寻址方式例 1:MOV AL,
12、5 (立即寻址方式)指令执行后, (AL)=05HMOV AX,3064H指令执行后, (AX)=3064H 例 2:MOV AX,BX (寄存器寻址方式)指令执行前(AX)=3064H , (BX)=1234H指令执行后, (AX)=1234H , (BX)保持不变例 3:MOV AX,2000H (直接寻址方式)如(DS)=3000H,执行情况如图所示。物理地址=16d*(DS)+2000H执行结果(AX)=3050H32000例 4: MOV AX,BX (寄存器间接寻址方式)如果(DS)=3000H, (BX)=2000H ,则:物理地址=30000+2000=32000H(AX)=3
13、050H例 5MOV AX,COUNTSI (寄存器相对寻址方式)如果(DS)=3000H, (SI)=1000H ,COUNT=1000H则:物理地址=30000+1000+1000=32000H(AX)=3050H例 6 :MOV AX,BXDI (基址变址寻址方式)如果(DS)=2100H, (BX)=0158H , (DI )=10A5H(221FDH)=1234H则:物理地址=21000+0158+10A5=221FDH所以(AX)=1234H例 7: MOV AX,MASKBXSI (相对基址变址寻址方式)如果:(DS)=3000H , (BX)=2000H , (SI)=1000
14、H,OP50309MASK=0250H (33250H)=1234H则:物理地址=16d*(DS)+(BX)+ (SI)+MASK=33250H(AX)=1234H例 8:指出下列指令的错误所在MOV AH,BX MOV BX,SIMOV CS,AX CMP 15,BXMOV BP,AL MOV 20H,AHMOV AL,300H XCHG 60,BLXCHG AX,CL POP CS【解答】类型不一致 两个操作数不能都是存储单元CS 不能作目的操作数 立即数不能为目的操作数类型不一致 立即数不能为目的操作数类型不一致 立即数不能为目的操作数类型不一致 POP 指令中不允许使用 CS(2)数据
15、传送指令将 4 字节传送到 AL 寄存器 【解答】MOV AL,4将 00FFH 字传送 CX 寄存器【解答】MOV CX,00FFH将 buffer1 单元的数据传送到 buffer2 单元【解答】 MOV AX,buffer1MOV buffer2,AX用字节输入指令从 20h 和 21h 端口输入一个数据【解答】IN AL,21HMOV AH,ALIN AL,20H10(3)算术运算指令设 X、Y、Z 均为双精度数,他们分别存放在地址为X,X+2 ;Y,Y+2;Z,Z+2 的存储单元中,存放时高位字在高地址中,低位字在低地址中,用汇编指令实现 WX+Y+24-Z 并用 W 和 W+2 单
16、元存放运算结果。【解答】MOV AX,XMOV DX,DX+2ADD AX,YADC DX,Y+2ADD AX,24ADC DX,0SUB AX,ZSBB DX,Z+2MOV W,AXMOV W+2,DX例:用汇编语言编写(V-(X*Y+Z-540) )/X 其中 X、Y 、Z 均为 16 位带符号数,已经分别装入 X、Y、Z、V 单元中,要求上式计算的结果的商存如 AX,余数存如 DX 寄存器。【解答】MOV AX,XIMUL YMOV CX,AXMOV BX,DXMOV AX,ZCWDADD CX,AXADC BX,DXSUB CX,540SBB BX,0MOV AX,V11CWDSUB
17、AX,CXSBB DX,BXIDIV X第三章汇编语言程序格式1、教学内容:汇编语言程序的开发,汇编语言程序的两种格式,汇编语言的参数、变量和标号,程序段的定义和属性,复杂的数据结构2、教学要求:掌握汇编语言语句格式,掌握简化段定义(或完整段定义)源程序格式。掌握常量表达、变量定义及应用,变量、标号和逻辑段的属性。 了解数值表达式、复杂数据结构和 DOS 的程序结构。 掌握基本伪指令和操作符:EQU;*;DBDWDD、?DUP; ORG$、OFFSET SEGPTR;.MODEL.STACK.DATA.CODEEND 、SEGMENT ENDS 了解不常使用伪指令和操作符:.RADIX;逻辑、
18、移位和关系运算符;DFDQDT;EVENALIGN ;THISSHORT TYPESIZEOF LENGTHOF;ASSUME GROUP、.SEG.DOSSEG.ALPHA; 掌握汇编语言源程序的编辑、汇编、连接和调试的开发方法 3、习题与解答我们在学习 8086 汇编语言程序格式时要注意以下几点:1):掌握汇编语言程序的编程格式和语句的四个组成部分。特别是构成操作数部分的两种操作符:分析操作符和合成操作符的作用和使用方法。2):常用的符号定义伪指令、数据定义伪指令、段定义伪指令和过程定义伪指令的功能、格式和使用方法。3):宏指令语句的定义,调用方法以及对应的宏扩展。下面我们分别学习这几点:
19、一:汇编语言程序的格式汇编语言的源程序是由各条语句构成的。每条语句可以由四项构成,格式如下:name operation operand ;comment12其中名字项是一个符号。操作项是一个操作码的助记符,它可以是指令、伪操作或宏指令名。操作数项是由一个或多个表达式组成,它提供为执行所要求的操作而需要的信息。注释项用来说明程序或语句的功能。 ;为识别注释项的开始。上面四项中带方括号的两项可有可无。各项之间必须用“空格”(SPACE)或“横表”(TAB) 符隔开。名字项(标号)关于名字或标号项我们要注意以下几点:1):标号在代码段中定义,后面跟冒号。在除代码段以外的其他段中定义时后面不跟冒号。
20、2):标号和一条指令的地址相联系,可作为 JMP 和 CALL 指令的操作地址。一般伪指令中的名字一般不作转移指令的操作数,但在间接寻址时可以作转移指令的操作数。名字可用来表示变量名、段名、过程名、符号名等。3):标号或名字可任选或省略。4):标号和变量均有三种属性:段值属性(SEGMENT)、段内的地址偏移量属性(OFFSET)和类型属性(TYPE).操作项它可以是指令、伪操作或宏指令名。1):指令就是前面我们所学近 100 条 8086 指令2):伪指令或宏指令我们在后面再作详细的介绍。操作数也就是程序要加工处理的对象。它可分为三类:常数、操作数和表达式。1):常数:IBM-PC 汇编语言
21、允许有二进制、八进制、十进制、十六进制常数,分别用后缀 B、O、D、H 表示,还允许使用字符串常数,须用单引号括起来。2):操作数:可以是常数操作数、寄存器操作数和存储器操作数。3):表达式:在汇编语言中,表达式可以是常数、寄存器、标号、变量以及运算符组成的算式。4):注释项:注释部分在语句后由“;”号作间隔,用来对语句的功能后某一程序段加以说明,使程序易读13下面我们学习一些汇编语言常用的运算符:算术运算符算术运算符有、*、/和 MOD。其中 MOD 是取余。算术运算符可用于数字表达式或地址表达式中。注意:当用于地址表达式中时,只有当其结果有明确的物理意义时其结果才有效。逻辑运算符逻辑运算符
22、有 AND、OR、XOR 和 NOT。逻辑操作是按位操作的,它只能用于数字表达式中。关系运算符 关系运算符有 EQ(相等)、NE( 不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)六种 .注意:关系操作符的两个操作数必须都是数字或是同一段内的两个存储器地址,计算结果应为逻辑值:结果为真时,表示为 0FFFFH,结果为假时,则表示为 0。例:MOV BX,(PORT_VAL LT 5)AND 20)OR(PORT_VAL GE 5)AND 30)当 POTE_VAL5 时,汇编结果应该是:MOV BX,30数值回送操作符它有 TYPE、LENGTH、SIZE 、OFFS
23、ET 、ORG5 种。这些操作符把一些特征或存储器地址的部分作为数值回送。下面我们分别学习以下它们。TYPE格式为:TYPE Variable 或 label如果是变量,则汇编语言将回送该变量以字节数表示的类型:DB 为 1,DW为 2,DD 为 4,DQ 为 8,DT 为 10。如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR 为-1,FAR 为-2。 LENGTH格式为:LENGTH Variable14对于变量中使用 DUP 的情况,汇编程序将回送分配给该变量的单元数,对于其他情况回送 1。例: ABC DW 100 DUP(0)对于指令: MOV CX,LENGTH ABC汇
24、编程序将使其形成为:MOV CX,100 SIZE格式为:SIZE Variable汇编程序应回送分配给该变量的字节数。注意:此值是 LENGTH 值和 TYPE 值的乘积。 OFFSET格式为:OFFSET Variable 或 label汇编程序将回送变量或标号的偏移地址值。 SEG格式为:SEG Variable 或 label汇编程序将回送变量或标号的段地址。二:常用的伪指令8086/8088 宏汇编程序提供了许多伪指令来辅助用户编程。伪指令是说明性的指令, “伪”体现在汇编时不产生机器指令。下面我们学习一些常用的伪指令的格式和功能。符号定义伪指令1)等值伪指令-EQU格式为: EQU
25、 功能是:给符号定义一个值,或定义为别的符号名,甚至是一条可执行的命令或表达式的值等。例: CONST EQU 298LAB EQU 10*3PH EUQ PUSH注意:EQU 伪指令不能重新定义,即在同一源程序中,用 EQU 伪指令定义的符号,不能在重新赋予不同的值。152)等号伪指令-=格式为:=功能:同 EQU 伪指令,但不同之处是可以对符号名进行重新定义。例:SET=5.SET=SET+1注意:SET=5 和 SET EQU 5 不允许在同一程序中同时定义使用。数据定义伪指令格式为:DB DWDDDQDT功能为:数据定义伪指令可以把其后定义的数据存入指定的存储单元,或者只分配存储器空间
26、而并不存入确定的数据。DB、DW、DD、DQ 、 DT 伪指令分别用来定义字节、字、双字、四字和五字,被说明的每个操作符分别占有一个字节、两个字节、四个字节、八个字节和十个字节。关于此伪指令我们还要注意以下几点:1):所定义的操作数可以是常数或表达式;2):所定义的操作数可以是字符串;3):所定义的操作数可以是?,表示保留存储空间,但不存入数据;4):所定义的操作数可以用复制操作符来复制的某些操作数.例:DATA DB 10,20STR DB ABCDEF DW ?,288ARRAR DB 30 DUP(?)ARRA DW 20 DUP(0)16段定义伪指令存储器的物理地址是由段地址和偏移地址
27、结合而成的。段定义伪指令使我们按段来组织程序和分配存储器。段定义的伪指令有SEGMENT、ENDS、ASSUME、ORG、PAGE、PUBLIC 等。1): SEGMENT 和 ENDS功能为:把汇编语言源程序分成个逻辑段,并指出逻辑段的起始和终止地址。格式为: SEGMENT 定位类型 组合类型 类别. . ENDS其中:1) 段名可由用户自己命名.2)定位类型、组合类型和类别是赋给段名的属性3)“号中的项可以省略.“定位类型“ 的省缺值为 PARA,表示该段必须从小段边界开始,即段地址的最低两个十六进制位必须为 0。“组合类型“ 的省缺值为 NONE,表示本段与其他逻辑上下不发生关系,每段
28、都有自己的基地址。2): ASSUME功能:为汇编程序提供了程序的段结构,并指明相应的逻辑段应通过对应的寄存器寻址。格式:ASSUME :,过程定义伪指令功能:过程定义伪指令又称子程序定义伪指令,用以在程序中定义一个子程序,以便提供主程序的调用。格式: PROC NEAR/FAR. . 17RETENDS程序结束伪指令功能:用来标志整个源程序的结束格式:END 三:宏指令的定义和调用宏指令语句是一种源程序级嵌式的程序语句。将程序中多次重复使用的源程序段,预先定义成所使用的宏指令语句,通常成为宏定义。在程序中可以用已定义的宏指令来代替着个程序段执行,称为宏调用。宏定义中可以定义使用参数,并且宏定
29、义可嵌套。调用时,汇编程序先对宏指令语句进行宏扩展,即将宏定义中的程序段嵌入到宏指令语句处。宏指令定义的好处:可以简化设计并且优化结构。宏指令定义的形式格式: MACRO Par1,Par2,语句 1;语句 2;语句 n;ENDM说明:1)宏指令名是宏定义的名字,作为宏指令语句的操作符,其功能就是MACRO 与 ENDM 之间语句的功能 .2)Par1,Par2 是定义的形式参数,指令的操作码和操作数均为形式参数,在进行宏调用时,宏指令语句中的实在参数将对形式参数作一一对应的替换.形式参数并不是必须的。3)MACRO 称为宏定义伪指令,ENDM 称为宏定义结束伪指令,它们之间的语句即程序段称为
30、宏体.宏指令的调用形式宏调用实际上就是调用执行已定义过的宏指令语句,其形式为:R1,R2,18说明:1)宏指令名必须和宏定义中的宏指令名一致,最多可由 1-8 个字母数字组成.2)R1,R2,为实在参数,调用时其类型和顺序必须和宏定义中的形蚕一一对应。例:定义一个缓冲区,它包含有 33H,34H,35H,和 36H,四个字符,把这4 个数据依次复制 20 次,存入接着的存储区,最后显示出复制结果。【解答】 .model small.stack.datasource db 33h,34h,35h,36htarget db 80 dup(?).code.startupmov ax,dsmov es
31、,axcldmov si,offset sourcemov di,offset targetmov cx,80rep movsbmov si,0mov bx,offset targetagain:mov dl,bx+simov ah,2int 21hinc sicmp si,80jb again.exti 019end第四章汇编语言程序设计1、教学内容:顺序程序设计,分之程序设计,循环程序设计,子程序设计,宏结构程序设计,模块化程序设计和输入输出程序设计。2、教学要求:掌握基本程序结构顺序结构、分支结构、循环结构、子程序和宏及其汇编语言程序设计方法 了解宏操作符、条件汇编和重复汇编、源程序包含
32、、代码连接和子程序库等程序设计方法 掌握伪指令:PROCENDP、MACROENDM、LOCAL;INCLUDEPUBLICEXTERN 了解伪指令:REPEATFORFORC、IFxx 熟悉常见程序设计问题:多精度运算,查表(查代码、特定值等) 、ASCII、 BCD 及十六进制数据间的代码转换;数据范围判断(09、AZ、a z ) 、字母大小写转换;字符串传送、比较等操作、求最小最大值、数据求和、统计字符个数;子程序的寄存器和共享变量传递参数3、习题与解答 例:假设有两个字变量 word1 和 word2,编写程序段来实现交换其值的功能。【解答】方法一:用汇编语言指令简单“直译”上面的交换
33、过程。data1 segmentWord1 dw?Word2 dw?Temp dw?data1 endscode1 segmentmov ax,word120mov temp,ax ;以上二语句实现语句 “TEMP=WORD1”mov ax,word2mov word1,ax ;以上二语句实现语句 “WORD1=WORD2”mov ax,tempmov word2,ax ;以上二语句实现语句 “WORD2=TEMP”code1 ends这种方法虽然完成了功能,但很显然不能充分地利用汇编语言的特点,程序的效率很低。方法二:用汇编语言的指令特点直接编程。data1 segmentWord1 dw?
34、Word2 dw?data1 endscode1 segmentmov ax,word1xchg ax,word2mov word1,axcode ends该方法充分利用了汇编语言的特点,不仅省去了中间变量 temp 的定义,而且程序的效率也大大的提高。例:设有 3 个字变量 X、Y、Z,初值分别为 5、6、7,试求出三者之和,并存入字变量 W 中。【解答】分析:在数据段中定义 4 个变量 X、Y、Z 和 W,并按要求初始化;代码段主体依次相加,最后将结果存入 W 中。;LT401.ASM.model small.stack 25621.datax dw 5y dw 6z dw 7w dw ?
35、.code.startupmov ax,xadd ax,yadc ax,zmov w,ax.exit 0end例:判断方程 ax 是否有实数根,若有实数根则将字节变量02cbxtag 置 1,否则置 0(a,b,c 均为字节变量,表达-127+127 的数据) 。【解答】分析:二元一次方程有根的条件是:b .依据题意,首先计算042ac出 b 和 4ac,然后比较两者的大小,根据比较的结果分别给 tag 赋不同的初2值。.model small.stack 256.data_a db ?_b db ?_c db ?tag db ?.code.startupmov al,_bimul almov
36、 bx,ax22mov al,_aimul _cmov cx,4imul cxcmp bx,axjge yesmov tag,0jmp doneyes: mov tag,1done: . exit 0end上面的这道例题还可以用条件控制伪指令实现有根判断,程序如下:.model small.stack 256.data_a sbyte ?_b sbyte ?_c sbyte ?tag byte ?.code.startupmov al,_bimul almov bx,ax ;bx 中为 b2mov al,_aimul _cmov cx,4imul cx ;ax 中为 4 ac.if sword
37、 ptr bx =ax ;比较二者大小mov tag,0 ;第一分支体:条件不满足,tag0.else23mov tag,1 ;第二分支体:条件满足,tag1.endif.exit 0end例:计算 1100 数字之和,并将结果寸入字变量 SUM 中。【解答】分析:程序要求 SUM=1+2+3+100,这是一个简单的记数循环,完成100 次简单的加法。我们编写一个 100 次的记数循环结构;循环开始前将被加数清 0,加数置 1,循环体内完成一次累加,每次加数递增 1。LOOP 指令要求循环次数预置给 CX,每次循环 CX 递减 1,这样,循环体内加数就可以直接用循环控制变量 CX,简化循环体,
38、完成与题目等价的 1001 的累加。.model small.stack 256.datasum dw?.code.startupxor ax,ax ;被加数清 0mov cx,100again: add ax,cx ;从 100,99,98。 。 。 。1 倒序累加loop againmov sum,ax ;将累加和送入指定的单元.exit 0end例:根据当前计算机的时间和日期,显示上午(AM)或下午(PM)以及所在的季节。【解答】:data1 segmentmsg db “time”Ampm db “am”,13,10db “season:$”24winter db “winter$”s
39、pring db “spring$”summer db “summer$autumn db “autumn$”data1 endscode1 segmentmov ah,21h ;取当前系统的时间int 21hif ch12 ;下午时间mov Ampm,p ;为显示 PM 做准备endifmov dx,offset msgmov ah,09hint 21h ;显示字符串 msg,到“$”为止mov ah,2ahint 21h ;取当前系统日期if(dh=12)|(dh=3)&(dh=6)&|(dh9) ;判断是否为 6 月,7 月,8 月mov dx,offset summerelse ;判断
40、是否为 9 月,10 月,11 月mov dx,offset autumendifmov ah,09h ;显示季度的名称int 21hend25子程序设计子程序在汇编语言中也被称为过程,它相当于高级语言中的过程和函数。每个子程序是具有一个唯一的过程名的程序段。过程定义有一对过程伪指令PROC 和 ENDP 来完成,其格式为:过程名 PROCNEAR/FAR过程体过程名 ENDP所以,过程常具有类似下列格式:subname proc ;具有缺省属性的 subname 过程push ax ;保护寄存器,顺序压入堆栈push bxpush cx ;过程体pop cx ;恢复寄存器,逆序弹出堆栈pop
41、 bxpop axret ;过程返回subname endp ;过程结束第五章32 位指令及其编程1、教学内容:32 位指令运行环境,32 位扩展指令,32 位指令的程序设计,80386 新增指令,80486 新增指令。2、教学要求:熟悉 32 位 80x86CPU 的 3 种工作方式和 32 位寄存器组,掌握 32 位寻址方式 理解 16 位指令如何实现 32 位扩展,熟悉常用 16 位指令的 32 位扩展功能及应用,其中新增指令:PUSHAPOPA、MOVSXMOVZX、INSOUTS、JECXZ 掌握 32 位指令编程方法 了解常用的 32 位新增指令:BTBTC BTRBTS 、 SE
42、Tcc、BSWAP XADD CMPXCHG、CPUID、CMOVcc 263、习题与解答32 位指令的操作与前面讲解的 8086 的一些指令的操作基本上是相同的,功能上也是基本相同的,所以,只要我们学员能够认真地把前面所学的 8086中的一些基本操作学好,那么对于 32 位指令的学习和 32 位指令的编程就非常容易了。他们在寻址方式、数据传送指令、算术运算指令、位操作指令、串操作指令、控制转移指令和处理机控制类指令几乎是相同的,在这里我们就不再做详细的说明了。我们通过几个简单的实例与前面所学的 8086 进行一下比较,让学员能够更清楚地了解 32 位指令以及 32 位指令的编程。学习一种的汇
43、编语言,必须了解这种 CPU 的寄存器、寻址方式以及各种指令。我们就先从寄存器开始着手吧。INTEL X86 常用寄存器通用寄存器 段寄存器AH/AL AX (EAX) 累加器 CS 代码段BH/BL BX (EBX) 基址 DS 数据段CH/CL CX (ECX) 计数器 SS 堆栈段DH/DL DX (EDX) 数据 ES 附加段(FS) 386 新增的段寄存器(Exx) 为 386 新增的 32 位寄存器 (GS) 386 新增的段寄存器指针寄存器 堆栈寄存器SI (ESI) 源索引指针 SP (ESP) 栈指针DI (EDI) 目的索引指针 BP (EBP) 基址指针IP 指令指针状态
44、寄存器|11|10|F|E|D|C|B|A|9|8|7|6|5|4|3|2|1|0| | | | | | | | | | | | | | | | | +- CF Carry Flag| | | | | | | | | | | | | | | | +- 1| | | | | | | | | | | | | | | +- PF Parity Flag| | | | | | | | | | | | | | +- 0| | | | | | | | | | | | | +- AF Auxiliary Flag27| | | | | | | | | | | | +- 0| | | | | | | | |
45、| | +- ZF Zero Flag| | | | | | | | | | +- SF Sign Flag| | | | | | | | | +- TF Trap Flag (Single Step)| | | | | | | | +- IF Interrupt Flag| | | | | | | +- DF Direction Flag| | | | | | +- OF Overflow flag| | | | +- IOPL I/O Privilege Level (286+ only)| | | +- NT Nested Task Flag (286+ only)| | +- 0| +
46、- RF Resume Flag (386+ only)+- VM Virtual Mode Flag (386+ only)怎么样,看起来大半部分都应该是我们以前很熟的了吧。首先必须强调的是,在用 32 位汇编语言编程的时候,所有的地址偏移量都是 32 位的,在寻址时千万不要还用原来的 16 位方式。对于通用寄存器来说,多了种形如 (Exx) 的 32 位寄存器,它的低 16 位内容就是原来的 16 位寄存器,而多出的高 16 位的内容,则只能通过使用 32 位寄存器来访问。再以指针寄存器为例,在寻址时一定要用 ESI、EDI、EBP 等等,必须要把以前那种 mov ax,si 之类的指令改
47、为 mov ax,ESI。从 386 开始,多出了 FS、GS 这两个新的段寄存器。由于我们学习的目的是为了今后写在线汇编,所以很多繁琐的问题都不会直接遇到。为了能更快地投入实际运用,这里就不打算去讲述保护模式的细节了. 这个简单的结论就是:你在 VC 中写在线汇编时,尽量不要去碰段寄存器!下面将开始讲述 INTEL X86 的 32 位偏移地址构成方式。这里给出关于 80386 寻址模式的一张列表:基地址 + (变址 X 比例因子) + 偏移量|无 | |无 |EAX| |EAX|EBX| |EBX| |1|28|ECX| |ECX| |2| | 无 |EDX| + |EDX| X |4| + | 8 位|ESP| |-| |8| |32 位|EBP| |EBP|ESI| |ESI|EDI| |EDI|其中, “-”表示 ESP 不能被用作变址寄存器在 80386 寻址时,其默认的段寄存器取决于所选择的基地址寄存器。如果基地址寄存器是 ESP 或者 EBP,则默认的段寄存