1、汇编语言程序设计总复习,复习提纲,总共九章教学内容重点掌握第一章到第七章1、掌握数据在计算机内的表示及其相互转换2、计算机基本组成及各部分主要功能3、汇编指令寻址,硬指令/伪指令的功能与使用形式4、利用汇编语言实现程序的基本控制结构5、中断系统与常用外设的I/O程序设计6、系统功能调用,第一章,熟练掌握:数值数据在计算机内部的各种表示,二进制、八进制和十六进制之间的转换方法。基本数据类型(字节、字、双字等)在汇编语言中的符号表示形式,它们计算机内部的存储形式以及符号扩展的含义。,重要知识点, 数制 数制之间的转换 运算 数和字符的表示,1. 数 制,二进制: 基数为2,逢二进一 11012 =
2、 12 3 + 12 2 + 12 0 = 1310十六进制:基数为16,逢十六进一 1001, 0001, 1000, 0111 9 1 8 7 = 9 16 3 + 1 16 2 + 8 16 1 + 7 16 0,2. 数制之间的转换,二进制 十六进制 十进制 二进制 十进制 十六进制,降幂法 除法, 算术运算 二进制数:逢二进一 借一当二 十六进制数:逢十六进一 借一当十六,3. 运算(算术运算和逻辑运算), 逻辑运算(按位操作),“与”运算(AND) “或”运算(OR) A B AB A B AB 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1
3、 1 1“非”运算(NOT) “异或”运算(XOR) A A A B AB 0 1 0 0 0 1 0 0 1 1 1 0 1 1 1 0,4. 数和字符的表示, 数的表示,数的常用表示法 原码 反码 补码原码表示法:符号 + 绝对值例:n = 8bit +3原码 = 0 000,0011 = 03H - 3原码 = 1 000,0011 = 83H +0原码 = 0 000,0000 = 00H - 0原码 = 1 000,0000 = 80H 0 的表示不唯一反码表示法:正数的反码同原码,负数的反码数值位与原码相反例:n = 8bit +5反码 = 0 000,0101 = 05H - 5
4、反码 = 1 111,1010 = FAH +0反码 = 0 000,0000 = 00H - 0反码 = 1 111,1111 = FFH 0 的表示不唯一,补码表示法:正数的补码: 同原码负数的补码:(1)写出与该负数相对应的正数的补码 (2)按位求反 (3)末位加一,n位二进制补码的表数范围: - 2n-1 N 2n-1-1,无符号整数的表数范围: 0 N 2n-1,补码的加法和减法:求补运算 :对一个二进制数按位求反、末位加一 X补码 -X补码 X补码加法规则:X+Y补码 = X补码 + Y补码减法规则:X-Y补码 = X补码 + -Y补码 补码减法可转换为补码加法,例:, 字符的表示
5、ASCII码:用一个字节来表示一个字符,低7位 为字符的ASCII值,最高位一般用作 校验位。 例: A 41H a 61H 1 31H 换行 0AH 回车 0DH 空格 20H,问题?,负数的表示方法如:-5?,第二章 8086计算机组织,熟练掌握:8位、16位和32位寄存器组中各寄存器的名称、主要用途和它们之间的关系。内存单元的逻辑划分方法逻辑地址和物理地址之间的相互转换方法。,重要知识点, 计算机系统 存储器 中央处理机 外部设备,1. 计算机系统,计算机系统包括硬件和软件两大部分。,硬件:,软件:分为系统软件和用户软件,2. 存储器,存储单元的地址和内容:,字单元,字节单元,存储器地址
6、的分段:,20根地址线:地址范围 00000H FFFFFH小段:每16个字节为一小段,共有64K个小段 小段的首地址 00000H 0000FH 00010H 0001FH 00020H 0002FH FFFF0H FFFFFH 段起始地址:小段首地址物理地址:每个存储单元唯一的20位地址 段地址:段起始地址的高16位 偏移地址:段内相对于段起始地址的偏移值 (有效地址 EA),物理地址的计算:,物理地址 = 16d 段地址 + 偏移地址,问题:一个字单元的物理地址该如何表示呢?,举例:,内存数据区共占用10个字单元,已知起始地址为13BA:00BA,求该字节单元的物理地址是多少?PA=13
7、BA0+00BA=13C5AH,存储器的逻辑分段:,3. 中央处理机,8086/8088寄存器组:数据寄存器:指针及变址寄存器:SP、BP、SI、DI段寄存器: CS、DS、SS、ES控制寄存器: IP、FLAGS,CPU组成:算术逻辑部件ALU、控制逻辑、 工作寄存器,标志寄存器(程序状态字寄存器 PSW),15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,条件码标志: 控制标志:,OF 溢出标志 DF 方向标志 SF 符号标志 IF 中断标志ZF 零标志 TF 陷阱标志CF 进位标志AF 辅助进位标志PF 奇偶标志,OF DF IF TF SF ZF AF PF
8、CF,4. 外部设备,外设接口(Interface) 每个接口包括一组寄存器: 数据寄存器 状态寄存器 命令寄存器端口(Port)地址 0000FFFFH,举例,要输入端口1234H中的8位数据,其指令应是( )mov dx,1234hin al,dx,第三章 8086的寻址方式和指令系统,熟练掌握:七种最基本的操作数寻址方式的含义,有效地址各种指令的功能、特殊要求(注意事项)和隐含操作数, 指令系统 寻址方式 与数据有关的寻址方式 与转移地址有关的寻址方式,重要知识点,问题:哪些寄存器可以用来寻址?,1. 8086的寻址方式,与数据有关的寻址方式:立即寻址 MOV AX , 3069H寄存器
9、寻址 MOV AL , BH直接寻址 MOV AX , 2000H 寄存器间接寻址 MOV AX , BX 寄存器相对寻址 MOV AX , COUNT SI 基址变址寻址 MOV AX , BP DI 相对基址变址寻址 MOV AX , MASK BX SI ,与转移地址有关的寻址方式:,段内寻址 段内直接寻址 JMP NEAR PTR NEXT 段内间接寻址 JMP TABLE BX 段间寻址 段间直接寻址 JMP FAR PTR NEXT 段间间接寻址 JMP DWORD PTR BX , 数据传送指令 算术指令 逻辑指令 串处理指令 控制转移指令 处理机控制指令,2. 8086的指令系
10、统,重点关注!指令的汇编格式指令的基本功能指令支持的寻址方式指令的执行对标志位的影响指令的特殊要求,数据传送指令: 通用数据传送指令 MOV、PUSH、POP、XCHG 累加器专用传送指令 IN、OUT、XLAT 地址传送指令 LEA、LDS、LES 标志寄存器传送指令 LAHF、SAHF、PUSHF、POPF,算术指令: 加法指令 ADD、ADC、INC 减法指令 SUB、SBB、DEC、NEG、CMP 乘法指令 MUL、IMUL 除法指令 DIV、IDIV 符号扩展指令 CBW、CWD 十进制调整指令 DAA、DAS、 AAA、AAS、AAM、AAD,逻辑指令: 逻辑运算指令 AND、OR
11、、NOT、XOR、TEST 移位指令 SHL、SAL、SHR、SAR、 ROL、ROR、RCL、RCR,串处理指令: 设置方向标志指令 CLD、STD 串处理指令 串重复前缀 MOVSB / MOVSW REP STOSB / STOSW REPE / REPZ LODSB / LODSW REPNE / REPNZ CMPSB / CMPSW SCASB / SCASW,控制转移指令: 无条件转移指令 JMP 条件转移指令JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、JP / JNP、 JB / JNB、 JL / JNL、 JBE / JNBE、JLE /
12、 JNLE、 JCXZ 循环指令 LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE 子程序调用和返回指令 CALL、RET 中断与中断返回指令 INT、INTO、IRET,处理机控制指令: 标志位处理指令 CLC、 STC、 CMC、 CLD、STD、 CLI、STI 处理机控制指令 NOP、HLT、WAIT、ESC、LOCK,下列指令哪些是错误的?,mov ax,bxmov ax,blmov cs,bxmov cs,1000hadd bx,esmov bx,sishl dx,cland ax,cx,div dx,2div 2inc axxchg ax,dsxchg al,
13、12hxchg si,di,mov al,sixchg al,dimov si,al,第四章 汇编语言程序格式, 汇编程序功能 伪操作 汇编语言程序格式 汇编语言程序的上机过程,1. 汇编程序功能,汇编程序的主要功能: 检查源程序,给出出错信息。 产生目标文件(.obj)和列表文件(.lst)。 展开宏指令。,2. 伪操作(伪指令),程序结构伪操作: 段定义伪操作、程序开始和结束伪操作等。 ( SEGMENT、ENDS、ASSUME、NAME、TITLE、END ) 数据类型及数据定义伪操作: 数据定义及存储器分配伪操作、表达式赋值伪操作、基数控 制伪操作等。 ( DB、DW、DD、DQ、DT
14、、LABEL、EQU、=、.RADIX ) 地址计数器与对准伪操作: ( $、ORG、EVEN ),data segment ; 定义数据段 data endsextra segment ; 定义附加段 extra endscode segment ; 定义代码段 assume cs:code,ds:data,es:extrastart: mov ax, data mov ds, ax ; 段地址段寄存器 code ends end start,3. 汇编语言程序格式,表达式:数字表达式 地址表达式,表达式操作符:,(1) 算术操作符: 、 、 、mod(2) 逻辑操作符: AND、OR、XO
15、R、NOT(3) 关系操作符: EQ、NE、LT、LE、GT、GE(4) 属性操作符: PTR、SHORT、THIS、HIGH、 LOW(5) 数值回送操作符: OFFSET、SEG、TYPE、 LENGTH、SIZE,举例,DATA_BYTE DB 10,4,10H,?DATA_WORD DW 100,100H,-5,?COUNT EQU ($-DATA_WORD)/2,MOV AX,WORD PTR DATA_BYTE+1,MOV AL,BYTE PTR DATA_WORD+3,MOV BL,DATA_BYTECBW,举例: ARRAY DW 1, 2 , $+4 , 3 , 4 , $+
16、4, 循环程序设计 分支程序设计,第五章 循环与分支程序设计,编制汇编语言程序的步骤:,(1) 分析题意,确定算法(2) 根据算法画出程序框图(3) 根据框图编写程序(4) 上机调试程序,分支结构 子程序结构,程序结构:,复合结构:多种程序结构的组合,顺序结构 循环结构,1. 循环程序设计,DO-WHILE 结构 DO-UNTIL 结构,初始化:设置循环的初始状态循环体:循环的工作部分及修改部分控制条件:计数控制 特征值控制 地址边界控制,例子: 将二进制数以十六进制的形式显示在屏幕上 统计 1 的个数,求数组元素之和 在数组中插入一元素,查找第一个是0的数据 数组运算(静态地预置逻辑尺) 从
17、键盘输入字符串(动态地修改标志位) 起泡排序(多重循环),注意:LOOP,LOOPNZ,LOOP指令的含义!,ADRR DB 0AH,02H,03H,33H,FFHCOUNT EQU $-ADRRRESULT DW ? MOVCX,COUNT MOVBX,-1NEXT: INC BX CMPADRRBX,0AH LOOPNZ NEXT JZDONE MOVBX,OFFHDONE: MOVRESULT,BX,举例,2. 分支程序设计,CASE 结构 IF-THEN-ELSE 结构,(1) 逻辑尺控制(2) 条件控制(3) 地址跳跃表(值与地址有对应关系的表),例子: 折半查找 根据不同条件转多个
18、程序分支(跳跃表法)JMP指令采用多种寻址方式:寄存器间接寻址基址变址寻址寄存器相对寻址如:分别求出数组元素正数负数0的和及平均值.,第六章 子程序结构, 过程定义伪操作 子程序的调用与返回 保存与恢复寄存器 子程序的参数传送 子程序的嵌套与递归,1. 过程定义伪操作,code segment main proc far . call subr1 . retmain endpsubr1 proc near . retsubr1 endpcode ends,segx segment subt proc far . ret subt endp . call subt . segx ends seg
19、y segment . call subt . segy ends,子程序调用:隐含使用堆栈保存返回地址 call near ptr subp (1) 保存返回地址(2) 转子程序 ( IP ) subp 的偏移地址 call far ptr subp (1) 保存返回地址(2) 转子程序 ( CS ) subp 的段地址 ( IP ) subp 的偏移地址,2. 子程序的调用与返回,子程序返回:ret,3. 保存与恢复寄存器,subt proc far push ax push bx push cx push dx . pop dx pop cx pop bx pop ax retsubt
20、endp,(1) 通过寄存器传送参数(2) 通过存储器传送参数(3) 通过地址表传送参数地址(4) 通过堆栈传送参数或参数地址,4. 子程序的参数传送,例子: 十进制数到十六进制数的转换 累加数组中的元素,data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ?data ends,proadd proc near lea si, ary mov cx, count xor ax, axnext : add ax, si add si, 2 loop next mov sum, ax retproadd endp,主程序: cal
21、l proadd子程序:,通过存储器传送参数:,通过地址表传送参数地址:,table dw 3 dup ( ? ) mov table, offset arymov table+2, offset countmov table+4, offset summov bx , offset tablecall proadd,proadd proc nearmov si, bxmov di, bx+2mov cx, dimov di, bx+4xor ax, axnext : add ax, si add si, 2loop nextmov di, axretproadd endp,子程序中:,sta
22、ck segment dw 100 dup (?) tos label word stack ends,通过堆栈传送参数或参数地址:,mov ax, stackmov ss, axmov sp, offset tos,子程序的嵌套: 主程序 子程序A 子程序B,递归子程序:n!,5. 子程序的嵌套与递归, 宏汇编 重复汇编 条件汇编,第七章 高级汇编语言技术,1. 宏汇编,宏:源程序中一段有独立功能的程序代码。宏指令:用户自定义的指令。在编程时,将多次 使用的功能用一条宏指令来代替。,宏定义: macro_name MACRO 哑元表 LOCAL 标号表 (宏定义体) ENDM宏调用: (必须
23、先定义后调用) macro_name 实元表 宏展开: 汇编程序把宏调用展开,例:求绝对值宏定义:absol MACRO oper LOCAL next cmp oper , 0 jge next neg opernext: ENDM宏调用:absol varabsol bx,宏展开: + cmp var , 0+ jge ?0000+ neg var+ ?0000: + cmp bx , 0+ jge ?0001+ neg bx+ ?0001: ,宏汇编操作符: 后面的注释不予展开。 % 表达式 汇编程序将%后面的表达式转换为数字,并在展开期间用这个数取代哑元。,第八章 输入/输出程序设计,
24、 I/O 设备的数据传送方式 程序直接控制 I/O 方式 中断传送方式,查询方式(程序控制方式)中断方式DMA方式(直接存储器存取方式/成组传送方式),1. I/O设备的数据传送方式,I/O 指令是主机与外设进行通信的最基本途径。DOS 功能调用和BIOS例行程序中的输入/输出功能也是由IN和OUT指令完成的。例:循环测试某状态寄存器的第2位是否为1 WAIT1 : IN AL , 27H TEST AL , 00000100B JZ WAIT1,2. 程序直接控制 I/O 方式,例:Sound 程序,in al , 61hout 61h , al,中断源:引起中断的事件外中断(硬中断): 外
25、设的 I/O 请求 可屏蔽中断 电源掉电 / 奇偶错 非屏蔽中断内中断(软中断): INT 指令 / CPU 错(除法错、溢出)/ 为调试程序设置的中断,3. 中断传送方式,中断向量: 中断例行程序的入口地址,中断向量表,INT n (n : 中断类型号)(1) 保存现场和返回地址(2) 转中断处理程序 ( IP ) ( n*4 ) ( CS ) ( n*4 + 2 )IRET,例: BIOS中断 INT 4AH 4AH 4 = 128 H 4AH 4 + 2 = 12A H ( 128H ) ( IP ) ( 12AH ) ( CS ),中断程序的编写步骤:主程序:设置中断向量设置 CPU
26、的中断允许位 IF设置设备的中断屏蔽位中断处理子程序:保存寄存器内容如允许中断嵌套,则开中断处理中断关中断送中断结束命令( EOI )给中断命令寄存器恢复寄存器内容IRET中断返回,DOS 功能调用,调用 DOS 或 BIOS 功能的基本步骤:将调用参数装入指定寄存器如需功能号,将它装入 AH如需子功能号,将它装入 AL按中断类型号调用 DOS 或 BIOS 中断检查返回参数是否正确DOS 功能与 BIOS 功能都通过 软件中断 调用。,1. DOS 中断调用,DOS 功能调用( INT 21H )用户在程序中调用 DOS 提供的一些子功能:(1) 一般设备的输入输出(2) 磁盘的输入输出及磁
27、盘文件的管理(3) 其它,DOS 键盘功能调用 ( AH = 1, 6, 7, 8, A, B, C ) (单字符输入/输入字符串/清除键盘缓冲区/检验键盘状态),例:单字符输入 ( AH=1 ) get_key: mov ah, 1 int 21h cmp al, Y je yes cmp al, N je no jne get_key yes: no: ,例:输入字符串 ( AH=0ah ) 定义缓冲区:maxlen db 32actlen db ?string db 32 dup ( ? )maxlen db 32, 0, 32 dup ( ? )maxlen db 32, 33 dup ( ? )lea dx, maxlenmov ah, 0ahint 21h,DOS 显示功能调用 ( AH=2, 6, 9 )(显示一个字符/显示字符串)例:显示一个字符 ( AH=2 )mov ah, 2mov dl, Aint 21h例:显示字符串 ( AH=9 )string db HELLO, 0dh, 0ah, $mov dx, offset stringmov ah, 9int 21h,感谢大家一年来一如既往地支持!,新年快乐!前程似锦!,祝大家:,