第 4 章 8086汇编语言程序设计

56
第 4 第 8086 第第第第第第第第 第第第第 第第第第 8086 8086 第第第第第第第 第第第第第第第 8086 8086 第第第第第第第 第第第第第第第 8086 8086 第第第第第第第 第第第第第第第 第第第第第第第第 第第第第第第第第 第第第第第第第 第第第第第第第 第第第第第第第第第第 第第第第第第第第第第

description

第 4 章 8086汇编语言程序设计. 几个概念 8086汇编语言的语句 8086汇编中的伪指令 8086汇编中的运算符 汇编语言程序设计 宏定义与宏调用 汇编语言程序设计实例. 几个概念. 汇编语言 汇编语言源程序 汇编 汇编程序. 4.1 8086汇编语言的语句. 汇编语言由指令性语句和指令性语句组成 一、指令性语句格式 [标号:] 操作码 [操作数1,] [操作数2] ;[注释] 二、指示性语句格式 [标识符(名字)] 指示符(伪指令) 表达式 三、有关属性 存储器操作数的属性有三种:段值、段内偏移量和类型。. - PowerPoint PPT Presentation

Transcript of 第 4 章 8086汇编语言程序设计

第 4 章 8086 汇编语言程序设计 几个概念几个概念 80868086 汇编语言的语句汇编语言的语句 80868086 汇编中的伪指令汇编中的伪指令 80868086 汇编中的运算符汇编中的运算符 汇编语言程序设计汇编语言程序设计 宏定义与宏调用宏定义与宏调用 汇编语言程序设计实例汇编语言程序设计实例

几个概念 汇编语言汇编语言 汇编语言源程序汇编语言源程序 汇编汇编 汇编程序汇编程序

4 . 1 8086 汇编语言的语句 汇编语言由指令性语句和指令性语句组成汇编语言由指令性语句和指令性语句组成 一、指令性语句格式一、指令性语句格式 [[ 标号:标号: ] ] 操作码 操作码 [[ 操作数操作数 11 ,, ] [] [ 操作数操作数 2] 2] ;;

[[ 注释注释 ]]

二、指示性语句格式二、指示性语句格式[[ 标识符(名字)标识符(名字) ] ] 指示符(伪指令) 表达式 指示符(伪指令) 表达式

三、有关属性三、有关属性 存储器操作数的属性有三种:段值、段内偏移存储器操作数的属性有三种:段值、段内偏移

量和类型。量和类型。

4 . 2 8086 汇编中的伪指令 一、 符号定义语句 一、 符号定义语句

11 、等值语句 、等值语句 格式:符号名 格式:符号名 EQU EQU 表达式表达式例: 例: ⑴ ⑴ PORT PORT EQU 1234EQU 1234

⑵ ⑵ BUFF EQU PORTBUFF EQU PORT ++ 5858 ⑶ ⑶ MEM MEM EQU DS:[BPEQU DS:[BP ++

20H] 20H] ⑷ ⑷ COUNT EQU CXCOUNT EQU CX

⑸ ⑸ ABC EQU AAAABC EQU AAA

22 、等号语句 、等号语句 格式: 格式: NUMNUM == 3434

…………

NUMNUM == 3434 ++ 11

二、变量定义语句二、变量定义语句

格式: 符号名 格式: 符号名 DB/DW/DD DB/DW/DD 表达式表达式

11 、定义一组数据 、定义一组数据 例例 11 : : BUFF DW 1234H, 0ABCDH, 8EH BUFF DW 1234H, 0ABCDH, 8EH

DW –79DH, 7B6AHDW –79DH, 7B6AH

22 、定义一串字符、定义一串字符例例 22 : : STR DB ‘ Welcome !’STR DB ‘ Welcome !’

33 、定义保留存储单元 、定义保留存储单元 例例 33 : : SUM DW ? ,SUM DW ? , ??

44 、复制操作、复制操作复制操作符复制操作符 DUPDUP (( DuplicationDuplication ))可预置重可预置重

复的数值复的数值例例 44 : : ALL_ZERO DB 0ALL_ZERO DB 0 ,, 00 ,, 00 ,, 00 ,, 00

用复制操作可改为:用复制操作可改为:ALL_ZERO DB 5 DUPALL_ZERO DB 5 DUP (( 00 ))

55 、、将已定义的地址存入内存单元将已定义的地址存入内存单元 例例 55 : : LIT DD CYCLIT DD CYC

… …CYC: MOV AX , BXCYC: MOV AX , BX

三、段定义语句三、段定义语句 11 、 段定义语句格式:、 段定义语句格式: 段名 段名 SEGMENT [SEGMENT [ 定位类型定位类型 ] [] [ 组合类型组合类型 ] [‘] [‘ 类类

别’别’ ]] …… ……

段名 段名 ENDSENDS

只需要掌握只需要掌握 段名 段名 SEGMENT SEGMENT

…… ……

段名 段名 ENDSENDS

22 、段假设语句、段假设语句ASSUME ASSUME 段寄存器名:段名段寄存器名:段名 [,…][,…]

33 、、   ORGORG 伪指令与地址计数器 伪指令与地址计数器 $$

ORGORG 伪指令格式: 伪指令格式: ORG <ORG < 表达式表达式 >>

44 、、 PUBLICPUBLIC 和 和 EXTRNEXTRN 伪指令伪指令

四、过程定义语句四、过程定义语句

过程名 过程名 PROC NEAR/FARPROC NEAR/FAR

…………

RETRET

过程名 过程名 ENDPENDP

4 . 3 8086 汇编中的运算符

一、常用运算符一、常用运算符11 、算术运算符、算术运算符 +(加)、-(减)、+(加)、-(减)、 ** (乘)、(乘)、 //

(除)、(除)、 MODMOD ((求余)。求余)。22 、逻辑运算符、逻辑运算符

ANDAND 、、 OROR 、、 XORXOR 、、 NOT NOT

33 、、关系运算符关系运算符 EQEQ ((相等)、相等)、 NENE ((不等、)不等、) LTLT ((小于)、小于)、 GTGT ((大于)、大于)、 LELE ((小于等于)、小于等于)、 GEGE ((大于等于)。大于等于)。

例: 例: MOV DL , 10H LT 16MOV DL , 10H LT 16

例: 例: AND AX , 555 GT 222AND AX , 555 GT 222

二、 常用的操作符二、 常用的操作符44 、分析操作符、分析操作符

11 )) SEGSEG 操作符操作符例: 例: MOV AX , SEG BUFFMOV AX , SEG BUFF

22 )) OFFSETOFFSET 操作符操作符 例:例: MOV BX , OFFSET BUFFMOV BX , OFFSET BUFF

33 )) TYPETYPE 操作符操作符 对于变量有对于变量有 33 种: 种: 11 字节型;字节型; 22 字型;字型; 4 4 双字型双字型 ;; 对于标号有对于标号有 22 种:-种:- 11 NEARNEAR ((段内)段内) ,, -- 2 2 FARFAR ((段间)。段间)。

例: 例: BUFF DB 20HBUFF DB 20H MOV BX , OFFSET BUFF MOV BX , OFFSET BUFF

MOV BX,01MOV BX,01

44 )) LENGTHLENGTH 操作符操作符55 )) SIZESIZE 操作符操作符 SIZESIZE == TYPE×LENGTH TYPE×LENGTH

例:例: BUFF DB 10DIP(?)BUFF DB 10DIP(?) MOV CX,LENGTH BUFMOV CX,LENGTH BUF

MOV CX,10MOV CX,10 MOV CX,SIZE BUFMOV CX,SIZE BUF

MOV CX,20MOV CX,20

55 、综合运算符(合成操作符)、综合运算符(合成操作符)11 )) PTRPTR 运算符运算符

格式: 类型 格式: 类型 PTR PTR 表达式表达式例:例: INC WORD PTR [BX] INC WORD PTR [BX]

22 )) THISTHIS 操作符操作符格式: 格式: THIS THIS 类型类型 (( 或属性或属性 ))例:例: FIRST EQU THIS BYTEFIRST EQU THIS BYTE

SECOND DW 100 DUP SECOND DW 100 DUP (( ?? ))

4 . 4 汇编语言程序设计 常用的汇编语言程序框架:常用的汇编语言程序框架: DATADATA SEGMENT SEGMENT ;;定义数据段定义数据段

VAL1 DB 12H , 8EH VAL1 DB 12H , 8EH ;;定义变量定义变量 …… …… DATADATA ENDS ENDS ;;数据段结束数据段结束 CODE CODE SEGMENT SEGMENT ;;定义代码段定义代码段 ASSUME DS:DATA , CS: CODEASSUME DS:DATA , CS: CODE ;;段属性说明段属性说明 START: MOV AX , DATASTART: MOV AX , DATA ;;初始化初始化 DSDS MOV DS , AXMOV DS , AX …… …… MOV AX , 4C00HMOV AX , 4C00H ;;返回返回 DOSDOS INT 21HINT 21H CODE ENDSCODE ENDS ;;代码段结束代码段结束 END STARTEND START ;;源程序结束源程序结束

一、汇编语言程序设计基本步骤 一、汇编语言程序设计基本步骤 分析问题-分析问题- > > 绘制流程图-绘制流程图- >> 编写编写

程序-程序- >> 检查和调试 检查和调试 二、汇编语言程序的基本结构二、汇编语言程序的基本结构

11 、顺序结构、顺序结构

22 、分支结构 、分支结构

33 、循环结构 、循环结构

44 、子程序 、子程序

Call proc1

ret

4 . 5 宏定义与宏调用

11 、宏定义、宏定义宏指令名 宏指令名 MACRO <MACRO < 形式参量表形式参量表 >>

… …

… …

ENDMENDM

22 、宏调用、宏调用宏指令名 实元表宏指令名 实元表

例例::MULTY MACRO OPR1MULTY MACRO OPR1 ,, OPR2OPR2 ,, RESULTRESULT ;; 宏定义宏定义

PUSH AXPUSH AX MOV AL, OPR1MOV AL, OPR1 MOV AH, OPR2MOV AH, OPR2 IMUL OPR2IMUL OPR2

MOV RESULT , AXMOV RESULT , AX POP AXPOP AX

ENDMENDM

…… ……DATA DATA SEGMENT SEGMENTXXXX DB 12 DB 12YYYY DB 34 DB 34

ZZZZ DW ?DW ? …… …… MULTY XXMULTY XX ,, YYYY ,, ZZ ZZ ;; 宏调用,实参替代虚参宏调用,实参替代虚参 …… ……

4.6 汇编语言程序设计实例 11 、算术运算例题、算术运算例题

例例 11 :在偏移首地址为:在偏移首地址为 ARRAYARRAY 的内存储区,的内存储区,有有 100100 个字型数据,要求将数组的每个元素个字型数据,要求将数组的每个元素加加 11 ,试编写汇编语言程序完成该要求。 ,试编写汇编语言程序完成该要求。 DATA SEGMENTDATA SEGMENT

ARRAY DW 100 DUP (?) ;ARRAY DW 100 DUP (?) ; 定义定义 100100 个字型随机数个字型随机数DATA EDNSDATA EDNSCODE CODE SEGMENTSEGMENT

ASSUME DSASSUME DS :: DATADATA ,, CSCS :: CODECODE

…………

LEA BX , ARRAY LEA BX , ARRAY ;;设数组首设数组首地址指针地址指针

MOV CX , LENGTH ARRAY MOV CX , LENGTH ARRAY ;; 数组数据数组数据长长

AA1: INC WORD PTR [BX] , 1 AA1: INC WORD PTR [BX] , 1 ; ; 指定为字型数加指定为字型数加 11

ADD BX , 2 ADD BX , 2 ;; 移动地址指针移动地址指针 LOOP AA1 LOOP AA1 ;;循环操作循环操作 …… ……

完整程序请参看教材完整程序请参看教材

例例 2: 2: 有两个无符号字节型数组,设数组元素个数有两个无符号字节型数组,设数组元素个数相等,编程将数组中的对应元素相加,结果存相等,编程将数组中的对应元素相加,结果存入另一内存区。 入另一内存区。 DATA DATA SEGMENTSEGMENTM1 M1 DB 20 DUP (?)DB 20 DUP (?)M2 M2 DB 20 DUP(?)DB 20 DUP(?)M3 M3 DW 20 DUP (0)DW 20 DUP (0)DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT

…………

…………

LEA SI , M1 ; LEA SI , M1 ; 设数组设数组 11 的地址指针的地址指针 LEA DI , M2 LEA DI , M2 ;;设数组设数组 22 的地址指针的地址指针 LEA BX , M3 LEA BX , M3 ;;设结果区的地址指针设结果区的地址指针 MOV CX , 20MOV CX , 20AA1: MOV AL , [SI]AA1: MOV AL , [SI] ADD AL , [DI]ADD AL , [DI] MOV [BX] ,AL MOV [BX] ,AL ADC BYTE PTR[BX+1] ,0 ADC BYTE PTR[BX+1] ,0 ;;存结果的进位 存结果的进位 INC SIINC SI INC DIINC DI ADD BX , 2ADD BX , 2 LOOP AA1LOOP AA1

…… ……

22 、逻辑处理题、逻辑处理题例例 11 :将寄存器:将寄存器 ALAL 中高、低中高、低 44 位交换位交换

…………MOV AL , 0ABHMOV AL , 0ABH

MOV CL , 4MOV CL , 4

ROL AL , CL ROL AL , CL ;;移出位补充移空位移出位补充移空位 44 次次…………

例例 22 :将:将 AXAX 中的内容按相反顺序存入中的内容按相反顺序存入BXBX 中中

………… MOV AL , 1234HMOV AL , 1234H MOV CX , 16MOV CX , 16

AA1: SHL AX , 1 ;AA1: SHL AX , 1 ; 移出的位进到移出的位进到 CFCF RCR BX , 1 RCR BX , 1 ;; AXAX 中移出的位进入中移出的位进入 BXBX LOOP AA1LOOP AA1

…………

33 、代码转换例题、代码转换例题 例例 11 :编程将以:编程将以 $$ 结束的字符串中的小结束的字符串中的小

写字母改为大写字母。写字母改为大写字母。

DATA DATA SEGMENTSEGMENT

STR STR DB ‘heLLo,eveRyboBY !’,’$’DB ‘heLLo,eveRyboBY !’,’$’

DATA DATA ENDSENDS

…… ……

LEA BX , STRLEA BX , STRA1: A1: MOV AL ,[BX]MOV AL ,[BX]

CMP AL , ‘$’ ;CMP AL , ‘$’ ; 是是 $$ 符,则结束符,则结束 JE DONEJE DONE CMP AL , ‘a’ CMP AL , ‘a’ JB NEXT JB NEXT ;;低于,则为大写字母低于,则为大写字母 CMP AL ,’z’CMP AL ,’z’ JA NEXT JA NEXT ;;高于,则不是字母高于,则不是字母 SUB AL , 20H SUB AL , 20H ;;将小写字母改为大写将小写字母改为大写 MOV [BX] , ALMOV [BX] , ALNEXT: NEXT: INC BXINC BX JMP A1JMP A1

…………

例例 22 :十六进制数到十进制数的转换。:十六进制数到十进制数的转换。除除 1010 取余法 取余法

…………

MOV AX , 4B6CHMOV AX , 4B6CH MOV CX , 0 ;MOV CX , 0 ; 统计除法次数统计除法次数 MOV BX , 10 MOV BX , 10 ;;A1: MOV DX , 0 A1: MOV DX , 0 ;;被除数扩展为被除数扩展为 3232 位位 DIV BXDIV BX PUSH DX PUSH DX ;;将转换好的数存入堆栈将转换好的数存入堆栈 INC CXINC CX OR AX , AX ;OR AX , AX ; 转换直到商为转换直到商为 00 JNZ A1JNZ A1 …… ……

44 、表格处理题、表格处理题例例 11 :编程序将:编程序将 00 -- 99 的数字转换成所要求的密码的数字转换成所要求的密码 明码和密码的映射关系为:明码和密码的映射关系为:

00    1 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 922    7 1 6 9 0 8 3 4 57 1 6 9 0 8 3 4 5

DATA SEGMENTDATA SEGMENTTABLE DB 2,7, 1, 6 ,9, 0, 8, 3, 4, 5 TABLE DB 2,7, 1, 6 ,9, 0, 8, 3, 4, 5 ;;密码表密码表VAL1 DB 8, 4, 1, 7, 5 VAL1 DB 8, 4, 1, 7, 5 ; ; 被加密码(明码)被加密码(明码)VAL2 DB 5 DUP(?)VAL2 DB 5 DUP(?)DATA ENDSDATA ENDS…………

…… …… MOV SI , OFFSET VAL1MOV SI , OFFSET VAL1 MOV DI , OFFSET VAL2MOV DI , OFFSET VAL2 MOV CX , 5MOV CX , 5 LEA BX , TABLE LEA BX , TABLE ;;表格首地址指针表格首地址指针A1A1 : : MOV AL ,[SI ] MOV AL ,[SI ] ;; 取明码取明码 XLAT XLAT ;;转换为密码转换为密码 MOV [DI] , ALMOV [DI] , AL INC SIINC SI INC DIINC DI LOOP A1LOOP A1

…… ……

66 、按数据大小排序题、按数据大小排序题 例例 11 :编程序实现,从一串带符号:编程序实现,从一串带符号

字型数据中找出最大值。字型数据中找出最大值。

DATA SEGMENTDATA SEGMENTBLOCK DW 762EHBLOCK DW 762EH ,, 6A8BH6A8BH , -, -

664AH664AH ,, 0B945H0B945H ,-,- 85DH85DHCOUNT EQU COUNT EQU (( $$ -- BLOCKBLOCK )/)/ 22DATA ENDSDATA ENDS

…………

LEA SI , BLOCKLEA SI , BLOCK

MOV CX , COUNTMOV CX , COUNT

MOV AX , [SI]MOV AX , [SI] ;; 取第取第 11 个数个数 DEC CX DEC CX ;; 准备与下个数比较准备与下个数比较AA1: ADD SI , 2AA1: ADD SI , 2

CMP AX , [SI] CMP AX , [SI] ;;与下个数比较与下个数比较 JG AA2 JG AA2 ;;前一个数大,则保留下次再前一个数大,则保留下次再

比比 MOV AX , [SI] MOV AX , [SI] ;;否则,取后一个数下次再比否则,取后一个数下次再比 AA2: LOOP AA1AA2: LOOP AA1

…… ……

4.7 DOS 功能调用与子程序设计 调用过程为:调用过程为:

⑴ ⑴ DOSDOS 功能调用号送功能调用号送 AHAH 寄存器;寄存器;⑵ ⑵ 如果需要,按要求给定输入参数(有的不如果需要,按要求给定输入参数(有的不需要输入参数);需要输入参数);⑶ ⑶ 写入中断指令写入中断指令 INT 21HINT 21H 。。调用结束,按功能使用其输出参数。调用结束,按功能使用其输出参数。

11 、单字符输入-、单字符输入- 11 号号 功 能:从键盘输入功 能:从键盘输入 11 个字符个字符

输入参数:无输入参数:无 输出参数:输出参数: AL=ASCIIAL=ASCII 码码

22 、单字符输出-、单字符输出- 22 号号 功 能:在屏幕上显示功 能:在屏幕上显示 11 个字符(个字符( ASCIIASCII

码)码) 输入参数:输入参数: DL=ASCIIDL=ASCII 码码 输出参数:无输出参数:无

例例 :: 从键盘输入两个从键盘输入两个 11 位十进制数,求位十进制数,求两数之和并在屏幕上显示结果。 两数之和并在屏幕上显示结果。

MOV AH , 1 MOV AH , 1 ;; DOSDOS 调用输入第一个数调用输入第一个数 INT 21HINT 21H

MOV BL , AL MOV BL , AL ;; 保存输入的第一个数保存输入的第一个数 MOV AH , 1MOV AH , 1

INT 21HINT 21H

ADD AL , BL ADD AL , BL ;; 两个两个 ASCIIASCII 码相加码相加 AAA AAA ; ; 调整加法结果为非压缩调整加法结果为非压缩 BCDBCD 数数 MOV DL , ALMOV DL , AL

ADD DL , 30H ADD DL , 30H ;;加法结果转换成加法结果转换成 ASCIIASCII 码码 MOV AH , 2 MOV AH , 2 ;; DOSDOS 调用输出到屏幕调用输出到屏幕 INT 21HINT 21H

33 、多字符输入-、多字符输入- 00AHAH 功 能: 多个字符输入到缓冲区功 能: 多个字符输入到缓冲区

输入参数:输入参数: DS:DX=DS:DX= 输入缓冲区首地址输入缓冲区首地址 输出参数:输出参数: DS:DX=DS:DX= 输入字符串所在缓冲区 输入字符串所在缓冲区 地址地址

44 、多字符输出-、多字符输出- 99 号号 功 能:多个字符输出到屏幕显示功 能:多个字符输出到屏幕显示 输入参数:输入参数: DS:DX=DS:DX= 输出字符缓冲区首地址输出字符缓冲区首地址 输出参数:无输出参数:无

例例 11 :在屏幕上显示一串字符:在屏幕上显示一串字符 。 。 DATA SEGMENT

BUFF DB ‘How do you do?’,0DH,0AH,’$’

DATA ENDS

CODE SEGMENT

ASSUME DS:DATA,CS:CODE

START: MOV AX , DATA

MOV DS , AX

LEA DX , BUFF

MOV AH , 9

INT 21H

…………

55 、单字符输入、单字符输入 // 输出-输出- 66 号号

66 号号 DOSDOS 功能实际上是功能实际上是 11 号和号和 22 号功号功能的组合,当能的组合,当 DLDL 寄存器的内容为寄存器的内容为 0FFH0FFH时,时, 66 号功能与号功能与 11 号功能同,即从键盘号功能同,即从键盘输入单个字符;而当输入单个字符;而当 DLDL 寄存器中放入寄存器中放入字符的字符的 ASCIIASCII 值,它就是值,它就是 22 号功能。号功能。

66 、过程终止-、过程终止- 4CH4CH 号号 该调用的功能是结束当前程序,并返该调用的功能是结束当前程序,并返

回调用它的程序,如在回调用它的程序,如在 DEBUGDEBUG 状态下状态下运行,则返回运行,则返回 DEBUGDEBUG ;如果在;如果在 DOSDOS 下下运行,则返回运行,则返回 DOSDOS 。在汇编语言程序结。在汇编语言程序结束处放上束处放上 MOV AX ,4C00HMOV AX ,4C00H 和和 INT 21HINT 21H两条指令,以利于程序执行完毕,返回两条指令,以利于程序执行完毕,返回操作系统控制。操作系统控制。

77 、子程序设计 、子程序设计 设计子程序要提供以下信息:设计子程序要提供以下信息:⑴⑴ 子程序的功能子程序的功能⑵⑵ 调用时需要的输入参数(入口参数)调用时需要的输入参数(入口参数)⑶⑶ 调用后提供的输出参数(出口参数)调用后提供的输出参数(出口参数)⑷⑷ 子程序中所使用的寄存器(以便调用子程序中所使用的寄存器(以便调用

前做必要的保护)前做必要的保护)

例例 11 :编写一子程序,完成一个:编写一子程序,完成一个 22 位十六位十六进进

制数到对应的制数到对应的 ASCIIASCII 码的转换。码的转换。 子程序名子程序名 : : CONHACONHA

功 能: 将功 能: 将 22 位十六进制数转换成对应位十六进制数转换成对应 的的 ASCCIIASCCII 码码输入参数: 输入参数: ALAL==待转换的数待转换的数输出参数: 输出参数: BXBX==转换好的转换好的 ASCIIASCII 码码使用寄存器:使用寄存器: ALAL 、、 AHAH 、、 BXBX 、、 CL CL

CONHA CONHA PROC FARPROC FAR

MOV AH , AL ;MOV AH , AL ; 保存待转换的数保存待转换的数AND AL , 0FH ;AND AL , 0FH ; 处理十六进制数低位处理十六进制数低位CMP AL , 0AH ;CMP AL , 0AH ; 是是 1616 进制中的字母吗?进制中的字母吗?JB ASC1 ;JB ASC1 ; 否,转移否,转移ADD AL , 07 ;ADD AL , 07 ; 是,先加是,先加 77

ASC1: ASC1: ADD AL , 30H ;ADD AL , 30H ; 转换为转换为 ASCIIASCII 码码 MOV BL , AL ;MOV BL , AL ; 保存转换好的低位保存转换好的低位 MOV CL , 4 MOV CL , 4 ;;移位控制 移位控制 SHR AH , CL ;SHR AH , CL ; 将原数右移将原数右移 ,, 处理高位处理高位

CMP AH , 0AH ;CMP AH , 0AH ; 是是 1616 进制中的字母吗?进制中的字母吗?JB ASC2 ;JB ASC2 ; 否,转移否,转移ADD AH , 07 ;ADD AH , 07 ; 是,先加是,先加 77

ASC2: ASC2: ADD AH, 30H ADD AH, 30H MOV BH , AH MOV BH , AH ;;保存转换好的高位保存转换好的高位

RETRETCONHA CONHA ENDPENDP

例例 22 :用子程序调用形式,编写从键盘输:用子程序调用形式,编写从键盘输入入 44 位位 1616 进制数的程序。进制数的程序。

子程序名子程序名 : ZH: ZH 功 能:检查键盘输入错误,将键入值转换成功 能:检查键盘输入错误,将键入值转换成

1616 进制数进制数 输入参数:输入参数: ALAL 输出参数:输出参数: AL AL 使用寄存器:使用寄存器: BX,CXBX,CX

CODE SEGMENTCODE SEGMENT

ASSUME CS :CODEASSUME CS :CODE

START: MOV CX , 4 START: MOV CX , 4 ;输入;输入 44 次次 MOV DX , CX ; MOV DX , CX ; 转换转换 44 次次 MOV BX , 0 MOV BX , 0 ;用;用 BXBX 保存输入保存输入

数数 RE1: MOV AH , 1 ; RE1: MOV AH , 1 ; 从键盘输入从键盘输入 INT 21HINT 21H

CALL ZH CALL ZH ;通过子程序转换;通过子程序转换 SHL BX , CL SHL BX , CL ;组合成;组合成 1616 进制数进制数

ADD BL , ALADD BL , AL

DEC DXDEC DX

JNZ RE1 JNZ RE1 ;循环输入;循环输入 44 个数个数 MOV AX , 4C00HMOV AX , 4C00H

INT 21HINT 21H

ZH PROCZH PROC CMP AL , ‘9’ CMP AL , ‘9’ ;; 将将 ASCIIASCII 码转换为码转换为 1616 进制进制 JBE A2 JBE A2 ;; 键入值键入值≤’≤’ 9’9’ (’(’ 0’-‘9’0’-‘9’ )则减)则减 30H30H CMP AL, ‘a’ CMP AL, ‘a’ ;; 键入值<’键入值<’ a’(‘A’-‘F’) a’(‘A’-‘F’) 则减则减 37H 37H JB A1JB A1 SUB AL , 20HSUB AL , 20H ;; 值在’值在’ a’ -‘f’a’ -‘f’ 则先减则先减 20H,20H, 再减再减 37H37HA1: SUB AL , 7A1: SUB AL , 7A2: SUB AL , 30HA2: SUB AL , 30H RETRETZH ENDPZH ENDPCODE ENDSCODE ENDS END STARTEND START