1 / 43

第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)

第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二). 主要内容: 1. 中断指令 2. 汇编语言程序设计. 介绍几条指令: INT n , IRET 格式: INT n ; n— 常数或表达式, n=0—255 或 INTO 执行操作: (SP)←(SP)-2 , (SP)) ← (PSW) (SP)←(SP)-2 , (SP)) ← (CS) (SP)←(SP)-2 ,← (IP) (IP) ←(N×4) (CS) ←(N×4+2)

Télécharger la présentation

第九讲 第四章 8086/8088 汇编语言程序设计 2006.11.14 (星期二)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第九讲 第四章 8086/8088汇编语言程序设计 2006.11.14(星期二) 主要内容: 1.中断指令 2.汇编语言程序设计

  2. 介绍几条指令:INT n,IRET 格式:INT n ; n—常数或表达式,n=0—255或INTO 执行操作: (SP)←(SP)-2, (SP)) ←(PSW) (SP)←(SP)-2,(SP)) ← (CS) (SP)←(SP)-2,← (IP) (IP) ←(N×4) (CS) ←(N×4+2) 清除IF、TF,避免进入中断以后不被外面其它中断所打断 及进入中断以后按单步执行。 例:.某中断程序入口地址为3375H:1234H,放置矢量表位置为0000H:0180H。问此中断类型号为___,写出入口地址在矢量表中放置顺序(由低到高)____________________。

  3. 类型0~3的中断称为内部中断。 •  类型0 :指令系统没有INT0这条指令 • 除数为0中断 • 除数为0 :它既不是外部中断 也不是软件中断。 • 是由 CPU自身产生的,所以无对应中断指令。 • 有符号数进行除法所得的商超出规定范围 • 有符号数进行除法运算,所得的商超出规定范围, • CPU自动产生类型为0的中断,转入响应的中断处理程序。 • 。

  4. 内存0:0000H~0:03FFH区域中,构成中断向量表,存放中断处理程序入口地址。每4个单元对应1个中断源。关系如下表:内存0:0000H~0:03FFH区域中,构成中断向量表,存放中断处理程序入口地址。每4个单元对应1个中断源。关系如下表:

  5. ∴ INTO跟在有符号数+、-后面: * 这条指令可以写在一条算术指令后面。 若产生溢出,OF=1,则启动中断过程,不进行任何操作。 (2) IRET——从中断返回指令(Interrupt return) 所有中断过程(服务程序)不管是硬还是软,最后一条指令一定是: IRET退出中断过程,返回中断时断点。 格式:IRET 执行操作:(IP)←((SP)+1,(SP)) , (SP) ←(SP)+2 (CS)←((SP)+1,(SP)) , (SP) ←(SP)+2 ( PSW)←((SP)+1,(SP)), (SP) ←(SP)+2

  6. 六、处理器控制指令 (一)标志处理指令 1、CLC (Clear carry flag ) 清CF标志 2、STC(Set carry flag ) 置CF标志 3、CMC(Complement carry flag ) 对CF求反 4、CLD(Clear direction flag ) 清DF标志 5、STD(Set direction flag ) 置DF标志 6、CLI(Clear interrupt flag ) 清IF标志 7、 STI (Set interrupt enable flag ) 置IF标志 (二)其他处理机控制指令 1、NOP(No operation ) 空操作 2、 HLT(Halt ) CPU暂停状态 3、 WAIT (Wait while pin not asserted ) CPU等待状态 4、 ESC(Escape ) 交权 5、 LOCK(Lock bus ) 总线锁定

  7. 第四章 8086/8088汇编语言程序设计 4.1 概述 4.2 汇编语言的基本语法 4.3 汇编语言程序设计的基本方法 4.4 DOS/BIOS中断调用 4.1 概述 汇编语言程序的上机处理过程 主要的汇编程序:MASM、TASM

  8. 例:求从1开始连续50个奇数之和,并将结果存放在名字为SUM的字存储单元中.其汇编源程序如下:例:求从1开始连续50个奇数之和,并将结果存放在名字为SUM的字存储单元中.其汇编源程序如下: DATA SEGMENT ;定义数据段, DATA为段名 SUM DW 0 ;由符号(叫变量名)SUM指定的内 存单元类型,定义一个字,初值为0 DATA ENDS ; 定义数据段结束 STACK SEGMENT STACK ;定义堆栈段,这是组合类型伪 指令,它规定在伪指令 后须跟STACK变量名 DB 200 DUP(0) ;定义堆残段为 200个字节的连 续存储区,且每个字节的值为0 STACK ENDS ;定义堆栈段结束 CODE SEGMENT ;定义代码段 ASSUME DS: DATA, SS: STACK, CS:CODE ;由ASSUM伪指令定义各段寄存器

  9. 初始化 START:MOV AX,DATA ;将DS初始化为数据段首 MOV DS,AX ;地址DATA MOV CX,50 ;CX置入循环计数值 MOV AX,0 ;清AX累加器 MOV BX,l ;BX置常量1 NEXT: ADD AX,BX ;累加奇数和,计50次 INC BX ;求下一个奇数 INC BX DEC CX ;循环计数器作减1计数 JNE NEXT ;未计完50次时,转至 NEXT循环 MOV SUM,AX; 累加和送存SUM单元 MOV AH,4CH ;DOS功能调用语句,机器 将结束本程序的运行,并返 回DOS状态(4CH为DOS 程序的入口地址) INT 21H CODE:ENDS ;代码段结束 END START ;整个程序汇编结束

  10. 4.2 汇编语言的基本语法 1. 常量、变量和表达式 • 常量 二进制 xxxxxxxxB 01000101B 八进制 xxxO 或xxxQ 721O或721Q 十进制 xxxx或xxxxD 1991或1991D 十六进制 xxxxH 0F1D4H 字符串 ‘xxx’或“xxx” ‘AB’ 以ASCII编码 数值常量、符号常量(用EQU或=定义)

  11. 变量 • 内存单元的名字,由DB/DW/DD/DQ/DT定义 • BUF DB ? • MOV BUF,AL • 变量的三种属性: • 段值 SEG • 偏移量 OFFSET • 类型 BYTE/WORD/...

  12. 标号 • 指令存放单元的符号地址,是转移/调用/循环指令的操作数 • 标号的三种属性: • 段值 SEG • 偏移量 OFFSET • 类型 NEAR/FAR

  13. 表达式 由操作数和运算符组成的序列 操作数可以是寄存器、常量(数值常量、符号常量)、存储器操作数(标号、变量) 运算符包括:算术运算符、逻辑运算符、关系运算符、数值返回运算符和属性运算符

  14. 数值返回运算符(分析运算符) • SEG 变量/标号 • OFFSET 变量/标号 • TYPE 变量/标号 • 变量返回类型:1字节、2字、4双字 • 标号返回类型:-1NEAR、-2FAR • LENGTH 变量:返回变量的个数 • SIZE 变量:返回变量所占地字节数

  15. 2. 指令语句 标号: 指令助记符 操作数 ;注释 START:MOV AX,DATA ;将DS初始化为数据段首

  16. 3. 伪指令语句 名字 伪操作命令 操作数 ;注释 • 符号定义语句 • 定义符号常量 • PRICE EQU 281 • PORT = 6 • PORT = PORT +1

  17. 数据定义语句 定义变量、分配存储单元等 变量名 DB/DW/DD/DQ/DT 操作数,…,操作数 操作数可以是:数值表达式或表、字符串、?、N DUP表达式 VAR DW ? ARRAY DB 100 DUP(0);DUP为重复符号 ARR2 DB 100 DUP(0,2DUP(3,2)) 定义500个字节并设初始值

  18. 段定义语句 • 过程定义语句(子程序定义) • 程序结束语句 END 表达式 表达式为程序的第一条指令的地址

  19. 汇编语言的基本语法 • 常量 数值常量, 01000101B, 32, 0F1D4H 符号常量(用EQU或=定义) • 变量 内存单元的名字,由DB/DW/DD/DQ/DT定义 • 标号 指令存放单元的符号地址,是转移/调用/循环指令的操作数

  20. 指令语句 执行性的语句,汇编时汇编程序将其转换成机器目标代码 标号: 指令助记符 操作数 ;注释 • 伪指令语句 说明性的语句,为汇编程序提供进行汇编所需要的有关信息,如定义符号、分配存储单元等,不生成目标代码 名字 伪操作命令 操作数 ;注释

  21. 分类 助记符 • 符号定义伪指令 EQU,=,LABEL • 数据定义伪指令 DB,DW,DD,DQ*,DT*,RECORD*, STRUC* • 段定义伪指令 SEGMENT, ENDS, GROUP*, ASSUME, ORG • 过程定义伪指令 PROC, ENDP • 模块定义与通信伪指令 EXTRN*,PUBLIC*,NAME,END • 宏处理伪指令* MACRO*, ENDM*, LOCALA*, REPT*, IRPC *, IRP*,PURGE* • 条件汇编伪指令* IF,ENDIF,IFI,IFZ,IFB,IFNB,IFE, IFDIF,IFDEF,IFNDEF, IFIDN,EISE • 列表伪指令 PAGE, TITLE, SUBTTL*, LIST, XLIST, % OUT* • 其他伪指令 COMMENT*, RADIX*, INCLUDE, EVEN*

  22. 实模式汇编语言源程序的结构——完整的段定义实模式汇编语言源程序的结构——完整的段定义 DATA SEGMENT …... DATA ENDS STACK SEGMENT STACK …... STACK ENDS CODE SEGMENT ASSUME DS:DATA, SS:STACK, CS:CODE START: …… CODE ENDS END START

  23. 段寄存器定义伪指令 ASSUME 段寄存器:段名 [,段寄存器:段名,...] • ASSUME语句习惯上作为代码段的第一条指令 • ASSUME语句是非执行性的伪指令,段寄存器的初值必须在程序中用指令设置。 CSEG SEGMENT ASSUME CS:CSEG, DS:DSEG MOV AX, DSEG MOV DS, AX …... • 对CS的赋值由操作系统装入EXE文件时自动完成

  24. 4.3程序设计的基本方法 • 分支结构 IF … THEN … ELSE TEST AX, 1 JZ LY N Y LN: …... 条件 JMP L0 程序段Y 程序段N LY: …… …... L0: …... 后继程序

  25. 分支结构 IF … THEN TEST AX, 1 JZ LY Y N LN: 条件 …... 程序段N LY: …… …... 后继程序段Y

  26. 循环结构 DO-UNTIL WHILE-DO

  27. 循环控制: 计数控制 LOOP/... 条件控制 JZ/... 例:计算1+2+3+…+100 MOV AX, 0 MOV BX, 0 MOV CX, 64H INC BX ADD AX, BX LOOP SUM SUM:

  28. 例:从1开始累加奇数,直到和大于10000为止,统计被累加的整数个数例:从1开始累加奇数,直到和大于10000为止,统计被累加的整数个数 MOV AX, 1 MOV BX, 1 MOV CX, 1H INC BX INC BX ADD AX, BX INC CX CMP AX,2710H JLE SUM HLT SUM:

  29. 子程序设计 • 过程定义 过程名 PROC [类型] …… ;指令序列 RET ;过程返回指令 过程名 ENDP 类型: NEAR——与主程序在同一个段 FAR ——可以与主程序不在同一个段

  30. 子程序设计 • 过程调用 • 近程调用 • CALL 过程名 • 将当前IP寄存器内容进栈(保存CALL下一条指令的偏移地址) • 将被调用过程的偏移地址送IP寄存器,控制程序转移到该过程

  31. DATA SEGMENT MESSAGE DB "Hello world!",0DH,0AH,"$" DATA ENDS SSEG SEGMENT STACK DB 100 DUP(?) SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DATA,SS:SSEG START: MOV AX, DATA MOV DS, AX CALL DISPLAY MOV AH, 4CH;返回DOS INT 21H DISPLAY PROC MOV DX, OFFSET MESSAGE MOV AX, SEG MESSAGE MOV DS, AX MOV AH, 9 ;显示以“&”为结尾地字符串 INT 21H RET DISPLAY ENDP CSEG ENDS END START

  32. 过程调用 • 远程调用 • CALL FAR PTR 过程名 • 将当前CS寄存器内容进栈(保存CALL下一条指令的段地址) • 将当前IP寄存器内容进栈(保存CALL下一条指令的偏移地址) • 将被调用过程的偏移地址送IP寄存器,段地址送CS寄存器,控制程序转移到该过程

  33. DATA SEGMENT MESSAGE DB "Hello world!",0DH,0AH,"$" DATA ENDS SSEG SEGMENT STACK DB 100 DUP(?) SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DATA,SS:SSEG START: MOV AX, DATA MOV DS, AX CALL FAR PTR DISPLAY MOV AH, 4CH INT 21H DISPLAY PROC FAR MOV DX, OFFSET MESSAGE MOV AX, SEG MESSAGE MOV DS, AX MOV AH, 9 INT 21H RET DISPLAY ENDP CSEG ENDS END START

  34. 子程序设计 • 返回指令 REP REP n 实现返回功能,并调整SP,即 SP+n SP

  35. 例1:程序如下,完成什么功能: DATA SEGMENT D1 DW -123H ;补码为FEDDH D2 DW -120H ;补码为FEE0H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ;说明代码段、数据段 BEGIN: MOV AX,DATA MOV DS,AX ;给DS赋段值 MOV BX,D1 CMP BX,D2 JGE NEXT MOV BX,D2 NEXT: MOV AH,4CH INT 21H CODE ENDS END BEGIN 分析汇编语言程序

  36. 原始数据 一次比较 二次比较 三次比较 四次比较 3 7 6 10 5 3 7 6 5 10 3 10 7 6 5 10 3 7 6 5 3 7 10 6 5 例2:关于按大小的排序程序(发泡) 小数在前排序。两两比较,保证前一个数据比后一个数据小 N个数,第1轮要进行N-1次比较,最大的沉底; 剩余N-1个数,第2轮进行N-2次比较。 若比较伦次用(i)表示,该轮次的比较次数为(N-i) 第一轮

  37. 原始数据 一次比较 二次比较 三次比较 3 7 6 5 10 3 7 6 5 10 3 6 7 5 10 3 6 5 7 10 第二轮 一次比较 原始数据 一次比较 原始数据 二次比较 第三轮 3 6 5 7 10 3 5 6 7 10 3 5 6 7 10 第四轮 3 6 5 7 10 3 5 6 7 10

  38. SUBP PROC ;完成(N-i)次比较 PUSH CX MOV CX,N SUB CX,DX ;本次比较次数(N-i ) MOV SI,0 RECMP: MOV AL,VAR[SI];取第1字节数到AL CMP AL,VAR[SI+1] JLE NOCH ;前小,不动 XCHG AL,VAR[SI +1 ] ;大,则互换 XCHG AL,VAR[SI] NOCH: INC SI LOOP RECMP ;CX←CX-1, ;若CX不等 于0则转 POP CX RET SUBP: ENDP CSEG: ENDS END B 程序如下: D SEGMENT VAR DB –1,-10,-100,27H,0AOH.47H N EQU $-VAR D ENDS CSEG SEGMENT ASSUME CS: CSEG,DS:D B: MOV AX,D MOV DS,AX ;给DS赋段值 MOV CX,N-1 ;每轮次比较次数 MOV DX,1 ;轮次 调用次数i AG: CALL SUBP INC DX LOOP AG MOV AH,4CH ;返回DOS INT 21H LOOP语句仅对CX计数器进行减一操作 程序中用DX代表比较轮次,该轮次的比较次数存于CX 子程序中成对使用PUSH和POP

  39. 程序如下: D SEGMENT VAR DB –1,-10,-100,27H,0AOH,47H N EQU $-VAR;$当前位置,紧接在47H D ENDS ;后面的那个位置 CSEG SEGMENT ASSUME CS: CSEG,DS:DSEG B: MOV AX,D MOV DS,AX ;给DS赋段值 MOV CX,N-1 ;剩余轮次比较 MOV DX,1 ;正进行的轮次 AG: CALL SUBP ;两两比较子程序 INC DX LOOP AG MOV AH,4CH ;返回DOS INT 21H 9CH FFH VAR: VAR: F6H F6H FFH 9CH 27H 27H 47H A0H 47H A0H N: N: 6H 6H 排序结果

  40. SUBP: PROC;完成(N-i)次比较 PUSH CX ;保护主程序循环变量 MOV CX,N SUB CX,DX ;本次比较次数(N-i) MOV SI,0 RECMP: MOV AL,VAR[SI];取第1字节数到AL CMP AL,VAR[SI+1] JLE NOCH ;前数小,不动 XCHG AL,VAR[SI +1 ] ;大,则互换 XCHG AL,VAR[SI] NOCH: INC SI LOOP RECMP ;CX←CX-1,;若CX不等 于0则转 POP CX ;取出主程序循环变量 RET SUBP: ENDP CSEG: ENDS END B (SI)= -1,(SI+1)=-10(AL)= -1 第一次互换 (SI+1)= -1(AL)= -10 第二次互换 (SI)= -10(AL)= -1 AL保留最大数据,不破坏内容

  41. 例3:在横线处填上适当语句,试确定:SP的初始值_______,数据段的字节数为_________,当执行完CALL指令后,即将执行MOV时,请回答:AX内容为______,DX内容为______,说明程序的功能。例3:在横线处填上适当语句,试确定:SP的初始值_______,数据段的字节数为_________,当执行完CALL指令后,即将执行MOV时,请回答:AX内容为______,DX内容为______,说明程序的功能。 C8H 2 15H 6 KKK PROC FAR XOR AX,AX MOV DX, AX INC DL MOV CL,NUM MOV CH, 0 BBB: ADD AL,DL INC DL LOOP BBB MOV SUM, AL KKK ENDP CODE ENDS END START STACK SEGMENT STAPN DW 100DUP(?) STACK ENDS DATA SEGMENT NUM DB 06H SUM DB ? DATA ENDS CODE SEGMENT _________________________ START:MOV AX, DATA MOV DS, AX CALL_____________ MOV AH,4CH INT 21H 说明:LOOP 第一次加法,CX=6; CX=5,第二次加法, CX=4→三次 CX=3→四次 CX=2→五次 CX=1→六次 CX=0→跳出 ASSUME DS:DATA,SS:STACK KKK

  42. 例4:阅读程序,说明功能 [DS]:[0150H] 36H 37H 42H 48H 30H ORG 100H MOV CX,5 MOV DI,150H BBB: MOV BL,0FFH MOV AL,[DI] CMP AL,3AH JAE DONE SUB AL,30H JB DONE MOV BL,AL DONE:MOV AL,BL MOV [DI+0AH],AL INC DI LOOP BBB HLT [DS]:[015AH] 6 _7 FFFF 0

  43. 作业: 自学:字符串输入(0AH), P171 4.2,4.4,4.6

More Related