1、 微机原理与接口技术北京邮电大学自动化学院叶 平Email: Tel: 010-611982091第四章 汇编语言及其程序设计2本章教学目标一、宏汇编1. 掌握常用的伪指令: DB, DW , DD, EQU, =, ORG,SEGMENT.ENDS , PROCENDP , ASSUME, MACROENDM , LOCAL, END等2. 如何汇编、连接生成 .EXE文件二、程序设计1. 能用汇编语言编写程序(一般约 40条左右)。2. 能熟练运用各种伪指令,包括会用宏指令(宏定义中如何用 LOCAL定义标号)。3. 能对程序改错,查错且会完善程序(程序填空)。4. 编程的题型可能有程序改
2、错、查错、完善、编程等。3第一节 x86系列汇编语言格式 4l用汇编语言编写的程序,汇编源程序必须翻译成 机器码 表示的程序,计算机才能运行。l 汇编程序 是将 汇编语言源程序 翻译成机器语言的一种系统程序l汇编格式指令与机器指令一一对应用机器码编程:A0 00 2002 06 01 20A2 02 20用汇编语言编写的程序段为:MOV AL , var1ADD AL , var2MOV var3 , AL汇编程序5 例 在内存中有一个数据块,其首地址为buffer (3000H:0200H),其中存放 16位 的 符号数 20个 。现要找出其中的 最大值 ,并将其存入 MAX字单元 (其偏移
3、地址为 0228H)。 借助 8086汇编指令,可以编写出如下程序:MOV AX, 3000HMOV DS, AXMOV SI, 0200HMOV CX, 14HDEC CXMOV AX, SICHK: ADD SI, 2CMP SI, AXJLE NEXTMOV AX, SINEXT: LOOP CHKMOV 0228H, AXINT 20Hbuffer406存储器分段 code segmentcode ends伪指令: 不是真正的指令代码;不产生机器代码;指示 汇编程序做何种操作, 定义代码段、数据段在何处。code segmentassume cs: codemov ax, 3000hm
4、ov ds, axmov si, 0200hmov cx, 14h段名 segment 定位类型 组合类型 类别 段名 ends ( Page135 段定义语句 )dec cxmov ax, sichk: add si, 2cmp si, axjle nextmov ax, sinext: loop chkmov 0228, axint 20hcode ends7data segmentdata endsstack segmentstack endscode segmentassume cs: code, ds: data, ss:stackmov ax, 3000hmov ds, axmov
5、 si, 0200hmov cx, 14hdec cxmov ax, sichk: add si, 2cmp si, axjle nextmov ax, sinext: loop chkmov 0228, axint 20hcode ends1、定义 数据段 和 堆栈段2、定义变量变量名 DB 表达式; DB、 DW 、 DD等8data segmentbuffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6dw 3, -15, -67, 39, 4, 20, -1668,-32766dw 32765, -525, 300count dw 20 max dw
6、 ?data endsstack segmentstack endscode segmentassume cs: code, ds: data, ss:stackmov ax, 3000hmov ds, axmov si, 0200hmov cx, 14hdec cxmov ax, sichk: add si, 2cmp si, axjle nextmov ax, sinext: loop chkmov 0228, axint 20hcode ends9data segmentbuffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6dw 3, -15, -67, 39, 4, 20, -1668,-32766dw 32765, -525, 300count dw 20 max dw ?data endsstack segmentstack endscode segmentassume cs: code, ds: data, ss:stackmov ax, datamov ds, axlea si, buffermov cx, countdec cxmov ax, sichk: add si, 2cmp si, axjle nextmov ax, sinext: loop chkmov max, axint 20hcode ends10