1 / 83

第三节 8086/8088 汇编语言

从模块 (n 个 ). 主模块 (1 个 ). 数据段. 数据段. 堆栈段. 堆栈段. 附加段. 附加段. 代码段. 代码段. END 标号. END. 第三节 8086/8088 汇编语言. 一、汇编语言程序基本结构. 说明: ①除代码段外,其余段可缺省 ; ②各种段均可有多个,用汇编语言指令可指定段与段寄存器关系,数据段≈附加段 ( 段寄存器不同 ) ; ③各段无顺序要求; ④通过 END 指明模块到此 结束 , 程序从“标号”处 开始 执行。. 汇编语言程序举例:. DATA SEGMENT

astrid
Télécharger la présentation

第三节 8086/8088 汇编语言

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. 从模块(n个) 主模块(1个) 数据段 数据段 堆栈段 堆栈段 附加段 附加段 代码段 代码段 END 标号 END 第三节 8086/8088汇编语言 一、汇编语言程序基本结构 说明: ①除代码段外,其余段可缺省; ②各种段均可有多个,用汇编语言指令可指定段与段寄存器关系,数据段≈附加段(段寄存器不同); ③各段无顺序要求; ④通过END指明模块到此结束, 程序从“标号”处开始执行。

  2. 汇编语言程序举例: DATA SEGMENT BUF1 DB 34H BUF2 DB 2AH SUM DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV AL, BUF1 ADD AL, BUF2 MOV SUM, AL MOV AH, 4CH INT 21H CODE ENDS END START

  3. 编辑 文本编辑器 源程序 .asm 汇编 masm 连接 link 转换 exe2bin 目标程序 .obj 可执行程序 .exe 可执行程序 .com 非编译 执行 ①DOS下执行 ②debug 运行结果 二、汇编语言程序开发过程

  4. 三、汇编语言语句格式 汇编语言程序由若干语句组成。 汇编语言语句类型: 指令语句—完成操作功能,能编排(比翻译简单)成机器语言代码(即80x86指令系统的指令); 伪指令语句—为汇编程序在编排源程序时提供有关信息; 宏指令语句—分为宏定义和宏调用语句,编排时用宏定义代替宏调用语句。 汇编语言语句通用格式: [名字项] 操作项 [操作数项] [;注释项]

  5. 1、名字项 组成:可由字母、数字、特殊字符(?、.、@、_、$)组成,数字不能作首字符,.只能作首字符。 类型:标号、变量。 (1)标号 组成:①语句标号--由名字+冒号(“:”)组成; ②过程名、段名等—只由名字组成。 属性:段 属 性—标号(定义时)所在段的起始地址; 偏移属性—标号与所在段起始地址间字节数; 类型属性—表明引用它时的特性, 段内引用为NEAR,段间引用为FAR。 回下页 回7页

  6. (2)变量 组成:在除代码段外的段中定义,只由名字组成。 属性:段 属 性—变量(定义时)所在段的起始地址; 偏移属性—变量与所在段起始地址间字节数; 类型属性—表明为它所保留的主存字节数, DB/DW/DD/DQ/DT对应1/2/4/8/10字节。 思考:标号与变量的主要区别? 指令中变量的数据类型如何表示? 2、操作项 组成:可为指令、伪指令或宏指令的助记符。 说明:指令助记符可带指令前缀。 转上页

  7. 3、操作数项 组成:[操作数]{[,操作数]} 操作数可为常数、寄存器名、标号/变量、数字/地址表达式 (1)常数 数值常数:二/八/十/十六进制数分别以B/Q/D(或缺省结尾字符)/H结尾,如001B、35Q、98D或98、0A2H。 字符串常数:用单引号括起来的一个或多个字符,如‘A’、‘AB’;字符用ASCII码形式存储。 应用:作立即数、位移量、赋初值用。 转5页

  8. (2)数字表达式 为常数、寄存器名、标号/变量与运算符的组合。 运算符有算术、逻辑、关系、数值返回、属性5种。

  9. (3)数值返回运算符 回下页

  10. 示例: D_SEG SEGMENT NUM1 DB 10 DUP(10) ;数据定义 NUM2 DW 20 DUP(0, 4 DUP(2)) NUM3 DB 10H, 5 DUP(?) NUM4 DB ‘STRING’ D_SEG ENDS ;假设DS指向D_SEG段 MOV AX, SEGNUM1 ;等价于AX←(DS) MOV BX, SEGNUM2 ;AX与BX值相同 MOV SI, OFFSET NUM1 ;NUM1相对于段的偏移量→SI MOV DI, OFFSETNUM2 ;等价于LEA DI, NUM2 MOV AH,TYPE NUM2 ;2→AH MOV BH,LENGTH NUM2 ;20→BH(指最外层参数) MOV AL,LENGTH NUM3 ;1→AL(指第一个参数) MOV CL, SIZE NUM2 ;20*2→CL MOV CH, SIZE NUM4 ;1*1→CH 转上页

  11. (4)属性运算符 PTR格式:<类型> PTR表达式 PTR功能:用新类型取代表达式默认的数据类型 PTR说明:①表达式为MEM操作数或变量时,类型可为BYTE、WORD、DWORD,表达式为标号时,类型可为NEAR、FAR; ②仅改变数据类型属性,且仅在本语句有效。 PTR示例:DATA1 DB 10H, 20H, 30H DATA2 DW 0123H …… MOV AX, WORD PTR DATA1 ;(AX)←2010H MOV BL, BYTE PTR DATA2 ;(BL)←23H MOV BYTE PTR[SI], 60H ;字节传送 SUBWORD PTR[BX], 36H ;字数据相减 JMP FAR PTR SUB_P1 ;段间直接转移 JMP WORD PTR[BX] ;段内间接转移 转转移地址寻址 回下页

  12. SHORT格式:指令助记符 SHORT标号 SHORT功能:转移地址属性为短,用8位位移量表示 SHORT说明: 指令助记符可为JMP/Jx/LOOP/CALL等; 可缺省SHORT,汇编语言根据标号与IP的偏移值自动选择SHORT或NEAR PTR。 转上页

  13. (5)各运算符的优先级 4、注释项 以“;”开头,以回车结束(注释只能作用于当前行)。

  14. 四、汇编语言伪指令 伪指令有6类: ①处理器选择伪指令 (8086无此指令) ②数据定义伪指令 ③段定义伪指令 ④程序开始和结束伪指令 ⑤表达式赋值伪指令 ⑥其他伪指令(地址计数、对准等) ⑦过程定义伪指令

  15. 1、处理器选择伪指令 格式: .8086 选择8086指令系统 .286 选择80286指令系统 .286P 选择保护方式下的80286指令系统 .386 选择80386指令系统 .386P 选择保护方式下的80386指令系统 .486 选择80486指令系统 .486P 选择保护方式下的80486指令系统 .586 选择Pentium指令系统 .586P 选择保护方式下Pentium的指令系统

  16. 2、数据定义伪指令 (1)数据定义 格式:[变量名] 类型定义符 参数{[,参数]} 操作:为变量分配存储空间,并置初值到存储单元 说明: 变量类型—数值变量和字符串变量; 类型定义符—可为DB/DW/DD/DF/DQ/DT,表示每个参数占1/2/4/6/8/10字节存储空间,字符串变量只能用DB类型定义; 参数—可为常数、表达式、?表达式、字符串、DUP表达式 字符串用单引号括起来,如‘ABCDE’ DUP表达式格式:n DUP(参数{[,参数]}), n表示重复次数。 回下页

  17. VAR1 02H 00H 04H 00H 02H 00H 04H 00H 76H 14H VAR2 ? ‘A’ ‘B’ ‘A’ ‘B’ ? ‘A’ ‘B’ ‘A’ ‘B’ 小 ‘H’ ‘E’ ‘L’ S1 S3 ‘E’ ‘H’ 大 示例: X1 DB 40H ;为X1分配1个字节,初值40H X2 DW 10*10 ;为X2分配2个字节,初值100(0064H) X3 DB 10,20,30 ;为X3分配3个字节,初值为10,20,30 Y1 DB 20H,? ;为Y1分配2个字节,第2个字节无初值 S1 DB ‘HEL’;S1占3个字节,值为ASCII码 S2 DB ‘H’, ‘E’, ‘L’;S2与S1相同 S3 DW ‘HE’;非字符串定义 VAR1 DW 2 DUP(2,4),1476H VAR2 DB 2 DUP(?,2 DUP(‘A’,‘B’) ) 转上页

  18. (2)数据别名定义 格式:[变量或标号] LABEL <类型> 操作:给变量/标号重新定义别名和改变别名属性 说明:不分配新的存储空间。 示例2: SUBPF LABEL FAR SUBP: SUB AX,AX …… JMP SUBP;段内 …… FARPRO PROC FAR …… JMP SUBPF;段间 示例1: BARRAY LABEL BYTE ARRAY DW 100 DUP(0) …… ADD AL,BARRAY[49] ;第50个字节,字节相加 …… ADD AX,ARRAY[98] ;第50个字,字相加

  19. 3、段定义伪指令 (1)段定义伪指令 格式:段名 SEGMENT[定位类型][组合类型][类别名] … ;语句体 段名 ENDS 操作:定义逻辑段 说明:代码段的语句体为指令和伪指令,其它段为伪指令。 a.定位类型:指定当前段起始地址的性质 ①PARA起始地址的低4位为0H,即16的倍数; ②PAGE起始地址的低8位为00H,即256的倍数 ③BYTE可从任意地址开始 ④WORD当前段的起始地址为偶地址 默认项是PARA 回21页

  20. b.组合类型:指明程序连接时,段的合并方法 ①PRIVATE不与其他模块中任何段连接或重叠 ②PUBLIC不同模块中PUBLIC类型的同名段连接在一起,形成一个单一的段(段长为∑) ③COMMON不同模块中COMMON类型的同名段重叠在一起,共享相同的存储区(共享存储区长度为max) ④STACK功能同PUBLIC,但新段为堆栈段(段长为∑) 默认项是PRIVATE c.类别名:指明程序连接时,段间次序的确定方法 LINK程序将各模块相同‘类别名’的各段依次序连续存放在内存中,但各段相互独立。 缺省项为空 段合并的优先级>确定段间次序的优先级。 回下页

  21. 段定义伪指令示例: D_SEG SEGMENT‘DATA' NUM1 DB 10 DUP(?) D_SEG ENDS S_SEG SEGMENT PARA ‘STACK' DW 100 DUP(?) S_SEG ENDS E_SEG SEGMENT PARA ‘DATA' STRING DB 'HELLO' E_SEG ENDS …… ;连接(LINK)时,D_SEG段与E_SEG段是连续的 转19页 转上页

  22. (2)指定段寄存器伪指令 格式:ASSUME 段寄存器:段名 {[,段寄存器:段名]} 操作:明确段和段寄存器的关系 说明:①代码段中必须至少有一个ASSUME语句,ASSUME可以出现在源程序中的任何地方; ②对同一段寄存器重复指定时最后一个有效。 a.CS的指定 必须指定CS,最后一次指定必须在开始执行段中,且段名为开始执行段的段名。 CS=END指令中标号/过程名对应的段 IP=END指令中标号/过程名在段内的偏移地址 转下页

  23. DS、ES 格式化区 重定位表 文件头 程序前缀区 100H SS SP=? 程序 代码 装入模块 程序区 CS IP=? EXE文件结构 重定位表—代码长度, 各段 偏移地址、长度等 EXE文件加载后结构 b.DS、ES的指定 对DS、ES的指定无效(文件加载后自动指向程序前缀),需要在程序中显式赋值(指定)。 程序前缀(PSP)—用户程序与命令行间的接口,占256字节 思考:文件加载时,如何得到CS、SS值? 回上页 回25页 回39页

  24. 对DS、ES赋值(指定)示例: D_SEG SEGMENT ;数据段 X DW ?, 4000H, 100 DUP(?) D_SEG ENDS E_SEG SEGMENT ;附加段 STRING DB 'EXAMPLE' E_SEG ENDS C_SEG SEGMENT PARA 'CODE' ASSUME CS:C_SEG,DS:D_SEG,ES:E_SEG START: MOV AX, D_SEG MOV DS, AX ;数据段基址→DS MOV AX, E_SEG MOV ES, AX ;附加段基址→ES 转MOV对段REG限制

  25. c.SS的指定 自动指定—当有组合类型为STACK的段时,SS自动指向该段; 此时用ASSUME指定SS时,SP=段长;否则SP=0000H 自动指定示例: S_SEG SEGMENT PARA STACK DW 100 DUP(?) S_SEG ENDS 思考:若有多个STACK属性的堆栈段,结果如何? 缺省指定—当无组合类型为STACK的段时,无论是否用ASSUME设定,SS自动指向程序区开始(SP=0000H); 思考:若未定义堆栈时,使用堆栈的结果? 转23页 回28页

  26. 显式指定—使用MOV指令,使SS及SP指向目的处。显式指定—使用MOV指令,使SS及SP指向目的处。 用指令赋值示例: S_SEG SEGMENT DW 100 DUP(?) ST LABLE WORD S_SEG ENDS C_SEG SEGMENT PARA 'CODE' ASSUME CS:C_SEG,SS:S_SEG,DS:NOTHING,ES:NOTHING START: …… MOV AX, S_SEG ;填入段基址 MOV SS, AX LEA SP, ST ;填入栈顶指针 C_SEG ENDS END START 思考:若有STACK属性的堆栈段,又用指令赋值后结果如何?

  27. 4、程序开始和结束伪指令 (1)模块命名伪指令 格式1:NAME [模块名] 操作1:给源程序进行模块命名 说明1:若模块名缺省,则自动用程序名代替。 格式2:TITLE 标题名 操作2:给源程序设置标题(模块命名) 说明2:模块名为标题名的前6个字符。 示例:NAME MM1 或TITLE ABCDEFGH ;模块名为ABCDEF

  28. (2)程序开始和结束伪指令 格式:END [地址标号] 操作:表明该模块到此结束,和整个应用程序从地址标号处开始执行 说明:①应用程序只能有一个主模块(地址标号不缺省); ②汇编程序不处理源程序中END后的信息。 应用程序与源程序文件: 应用程序可有多个源程序文件; 每个源程序文件只能为一个模块(在NAME/TITLE~END间); 所有模块中只能有一个主模块(END后地址标号不缺省); 每个模块中可有多个段; 每个段的类型通过与段寄存器对应或段组合类型定性。 转25页

  29. 5、表达式赋值伪指令 格式:名字 EQU 表达式 名字 = 表达式 操作:为表达式取一个名字,供以后引用 说明: ①表达式可为常数、变量/标号、指令助记符、字符串 ②同一源程序中,用EQU赋值的符号不能再次赋值,而用=赋值的符号名可重复赋值。 ③赋值语句不产生目标代码,也不占有存储单元(汇编程序扫描时,用表达式替代符号),目的是方便更新和提高可读性。 示例:CONST EQU 100*2 ;定义符号常数 ADDRS EQU [BX+10] ;为地址表达式定义名字

  30. ARRAY 0074H 01 00 02 00 7C 00 03 00 81 00 0078H 007CH 6、地址计数器和对准伪指令 (1)地址计数器$ 功能:保存当前正在汇编的指令(或数据)的地址 说明:$为有效地址EA(16位); 可参加构成表达式。 示例1:ARRAY DW 1,2,$+4,3,$+5 示例2:BUFFER DB 1,2,3,4,5 COUNT EQU $-BUFFER ;COUNT的值为BUFFER的长度

  31. D_SEG的00H 10H 20 30 40 50 17H (2)定位伪指令 格式:ORG 表达式 操作:将表达式的值送入汇编地址计数器(即命令汇编程序从表达式值位置生成目标代码) 说明:若需相对$移动,则表达式=$+偏移量。 示例: D_SEG SEGMENT PARA 'DATA’ ORG 10H X DB 20H, 30H ORG $+5 Y DB 40H, 50H D_SEG ENDS

  32. 7、过程定义伪指令 格式:过程名 PROC [类型] …… ;过程体语句 RET 过程名 ENDP 操作:定义过程,供调用 说明: 可用CALL或END启动过程,用过程体中RET结束过程调用; 类型有NEAR和FAR两种(缺省时为NEAR),分别表示可以进行段内和段间调用。 回60页

  33. 五、汇编语言程序返回DOS方法 汇编语言程序结构示例1: DATA SEGMENT …… DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX …… MOV AH, 4CH INT 21H CODE ENDS END START 回下页

  34. 汇编语言程序结构示例2: DATA SEGMENT …… DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA MAIN PROC FAR PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX …… RET MAIN ENDP CODE ENDS END MAIN 转上页

  35. 1、使用DOS功能调用返回ODS 格式:MOV AH,4CH INT 21H 功能:带返回码返回DOS,返回码可由程序设置 例:将某字节数据块中负元素个数存入变量CNT。 DATA SEGMENT ARRAY DB -1,10,11,-7,-9 LEN EQU $-ARRAY CNT DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START:MOV AX,DATA MOV DS,AX LEA SI,ARRAY MOV CX,LEN MOV DL,0 LP: MOV AL,[SI] CMP AL,0 JGE JSU INC DL JSU: INC SI LOOP LP MOV CNT,DL MOV AH,4CH INT 21H CODE ENDS END START

  36. 2、使用中断功能调用返回DOS 格式:INT 20H 功能:程序结束并返回DOS 3、使用过程中RET返回DOS 格式:MAIN PROC FAR PUSH DS MOV AX, 0 PUSH AX …… RET MAIN ENDP …… END MAIN 功能:主程序设计为FAR过程,通过调用INT 20H返回DOS(利用程序前缀+RET指令实现)。 回下页

  37. DS、ES INT 20H 其它前缀信息 程序前缀区 CS 程序 信息 程序区 IP=? EXE文件加载后结构 程序前缀:共256字节,开始两单元为INT 20H。 END指令:执行MAIN函数体(即CS:IP),与CALL MAIN (有当前CS:IP的压栈过程)不同。 RET指令:自动弹出栈顶的4个字节,并送IP和CS。 功能实现:手工将程序前缀中INT 20H的地址压栈,即压入DS和0000H(见上页),执行RET时即可返回DOS。 转上页

  38. 示例:存储单元NUM中为一个16位二进数,将其中非零位的个数存入CNT示例:存储单元NUM中为一个16位二进数,将其中非零位的个数存入CNT D_S SEGMENT NUM DW ? CNT DB ? D_S ENDS S_S SEGMENT STACK DB 64 DUP(?) S_S ENDS CODE SEGMENT ASSUME CS:CODE,DS:D_S,SS:S_S MAIN PROCFAR PUSH DS ;段地址 MOV AX, 0 PUSH AX ;偏移地址 MOV AX,D_S MOV DS,AX MOV CX,0 MOV AX,NUM LP1: AND AX,AX JZ DONE SAL AX,1 JNC NEXT INC CL NEXT: JMP LP1 DONE: MOV CNT,CL RET ;偏移地址 ;段地址 MAIN ENDP CODE ENDS END MAIN

  39. CS、DS、ES、SS 程序前缀区 程序 代码 IP=0100H 程序区 SP COM文件结构 COM文件加载后结构 4、COM文件结构 COM文件结构(是EXE文件的简单版本): 无文件头域(亦无重定位表),只有一个段(长度<64K),用中断指令返回,代码中过程属性用NEAR。 COM文件加载:自动生成程序前缀(长100H),所有段寄存器全部指向程序前缀段,IP=0100H。 COM文件生成:用exe2bin将EXE文件转换成COM文件。 转23页 回下页

  40. COM文件源程序结构示例: CODE SEGMENT ASSUME CS:CODE, DS:CODE,ES:CODE,SS:CODE START:JMP COD_S BUF DB 64 DUP(?) ;数据区 CNT DW 2 STA DB 64 DUP (?) ;堆栈区 COD_S: MOV AX,CS ;给DS、ES、SP赋初值 MOV DS,AX MOV ES,AX MOV SS,AX LEA SP,COD_S …… ;主程序体 MOV AH,4CH INT 21H CODE ENDS END START ;标号必须为CS段第一条语句 转上页

  41. T T 条件 初始化 初始化 条件 F F T 循环体 条件 语句串 语句串2 F 改信息 循环体 语句串1 T 条件 改信息 F 继续循环条件 多路条件 退出循环条件 … 语句串1 语句串n 第四节 结构化程序设计 结构化程序结构:顺序、分支(多路分支)、循环 回44页 回52页

  42. 一、顺序结构程序设计 目的:练习编写完整程序、熟练掌握指令和伪指令 例1:将压缩BCD码转换成ASCII BCD_BUF DB 96H ASC_BUF DB 2 DUP(?) …… MOV AL, BCD_BUF MOV CL, 4 MOV BL, AL SHR AL, CL ;右移4位,将高4位填0 ADD AL, 30H MOV ASC_BUF, AL AND BL, 0FH ADD BL, 30H MOV ASC_BUF+1, BL ……

  43. 例2:用直接查表法完成将键盘输入的一位十进数(0~9)转换成对应的平方值并存放在SQRBUF单元中。例2:用直接查表法完成将键盘输入的一位十进数(0~9)转换成对应的平方值并存放在SQRBUF单元中。 SQUTAB DB 0,1,4,9,16,25,36,49,64,81 SQRBUF DB ? …… MOV BX, OFFSET SQUTAB MOV AH, 1 INT 21H ;DOS功能调用的1号子功能是键盘输入 SUB AL, 30H ;返回值为ASCII码,存于AL中 XLAT;AL←((BX)+(AL)) MOV SQRBUF, AL 习题:将X、Y单元的字节数据的平均值存到Z单元。 思考:IVT与BIOS和DOS系统功能调用关系如何? 如何使用BIOS和DOS系统功能调用?

  44. T X≥0 F X←X取补 AX←X+Y 二、分支结构程序设计 目的:掌握各种分支转移的编程技巧(如跳转表法) 例1:变量X为一任意有符号字节数,若X为负数,则将其取补码;否则,和Y相加,其和存入AX中 …… MOV AL, X CMP AL, 0 JGEADDT NEG AL ;X求补 MOV X, AL JMP EXIT ADDT:ADD AL,Y ;X+Y ADC AH, 0 EXIT: …… 转41页

  45. AL←(N1),AH←(N2) T (AL)0≠0 F T (AH)0≠0 F AL←(AL)+1,AH←(AH)+1 AL (AH) D1←(AL),D2←(AH) 例2:设字节单元N1、N2中存放无符号数 (1)若两个均是偶数,则分别加1后送D1 、D2中 (2)若两个均是奇数,则直接送D1 、D2中 (3)若一奇一偶,则把奇数送D1,偶数送D2中 MOV AL,N1 MOV AH,N2 TEST AL,01H JNE ENDO ;N1奇数转 TEST AH,01H JNEL1 ;N2奇数转 INC AL ;两偶数 INC AH JMP ENDO L1: XCHG AL,AH ;交换 ENDO: MOV D1, AL ;存放结果 MOV D2, AH

  46. TABLE TABLE SUB1 IP IP IP IP CS IP CS SUB1 SUB2 SUB3 SUB2 段内分支 段间分支 跳转表法实现多路分支原理: 跳转表是在某内存区域顺序排列的一组有规律的语句串的入口地址。 如是段内分支,每个地址占两个单元(IP的值) 如是段间分支,每个地址占4个单元(CS:IP的值)

  47. 例3:根据AL中为1的位(从低位到高位)把程序转移到8个不同的程序(段内)分支中去(跳转表其始位置在变量TABLE中)。例3:根据AL中为1的位(从低位到高位)把程序转移到8个不同的程序(段内)分支中去(跳转表其始位置在变量TABLE中)。 方法1—用寄存器间接寻址方法 CMP AL, 0 JE DONE LEA BX, TABLE L: SHR AL, 1 JNC NOT_YET ; CF=0跳转 JMP WORD PTR[BX] NOT_YET: ADD BX, TYPE TABLE ;Type Table=2 JMP L DONE: …… 思考:会不会产生死循环? 若会产生死循环,如何解除? 回下页

  48. 方法2—用变址寻址方法 CMP AL, 0 JE DONE MOV SI, 0 L: SHR AL, 1 JNC NOT_YET JMP TABLE[SI];缺省属性为WORD PTR NOT_YET: ADD SI, TYPE TABLE JMP L DONE: …… 思考:若实现段间分支,需哪些改动/要求? 若SHR改为SHL,程序有哪些改动? 转转移地址寻址 转上页

  49. 三、循环结构程序设计 循环控制方式:计数法(减量/增量)、条件控制法 循环类型:运行循环体、判断与控制的先后次序 常规应用方法: 已知循环次数— 增量法:CMP+Jx指令 减量法:①LOOP指令(结束计数为0) ②CMP+Jx指令(结束计数不为0) 未知循环次数— 条件控制法:CMP/TEST+Jx[+JMP]指令 转41页

  50. 1、单重循环程序设计 减量计数法例1:将以S1为起始地址的26个字母依次传送到以S2为起始地址的连续单元中。 DATA SEGMENT S1 DB ‘ABCD……XYZ’ DATA ENDS ESTRA SEGMENT S2 DB 26 DUP(?) ESTRA ENDS …… MOV AX, DATA MOV DS, AX ;数据段基址→DS MOV AX, ESTRA MOV ES, AX ;附加段基址→ES 回下页

More Related