1、1目 录实验一 数据传送 2实验二 算术运算 8实验三 代码转换 14实验四 程序的基本结构练习 20实验五 存储器(RAM 6264)扩展 25实验六 可编程并行接口(8255)扩展 28实验七 可编程计数/定时器(8253)扩展 .34实验八 A/D、D/A 转换 .45实验九 可编程串行通信接口(8251)扩展 532实验一:数据传送实验学时:2实验类型:验证实验要求:必修一实验目的1学习程序设计的基本方法和技能,掌握用汇编语言设计、编写、调试和运行程序的方法;学习用全屏幕编辑软件 QEDIT.EXE 建立源程序(.ASM 文件) ;学习用汇编软件 MASM.EXE 对源文件汇编产生目标
2、文件( .OBJ 文件) ;学习用连接程序 LINK.EXE 对目标文件产生可执行文件(.EXE 文件) ;学习用调试软件 TD.EXE 调试可执行文件;2掌握各种寻址方法以及简单指令的执行过程。二实验器材PC 机三实验组织运行要求1利用堆栈实现 AX 的内容与 BX 的内容进行交换。堆栈指针SP=2000H,AX=3000H,BX=5000H;2汇编、调试、观察、记录结果;用 QEDIT.EXE 软件输入汇编语言源程序,以.ASM 格式文件存盘;用 MASM 对源程序进行汇编产生二进制目标文件(.OBJ 文件) ,再用连接程序 LINK 产生可执行文件( .EXE 文件) ;用调试软件 TD
3、 调试、运行程序,观察、记录结果。四实验步骤1进入子目录 E:SY86 后,利用 QEDIT.EXE(简称 Q)送入以下汇编语言源程序,并以 M1.ASM 文件存盘汇编语言程序的上机过程进入SY86 子目录E:CDSY86 E:SY86进入 QEDIT.EXE 编辑界面E:SY86 Q 输入文件名*.ASM (如 M1.ASM)后,输入源程序源程序DATA SEGMENT PARA PUBLICDATA ;数据段定义DB 512 DUP(0) DATA ENDS STACK SEGMENT PARA STACKSTACK ;堆栈段定义DB 512 DUP( ?)STACK ENDS 3CODE
4、 SEGMENT PARA PUBLICCODE ;代码段定义ASSUME CS :CODE,DS :DATA,ES:DATA,SS :STACKMAINPROC FAR ;定义过程程序PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX MOV SP,2000hMOV AX,3000hMOV BX,5000hPUSH AXPUSH BXPOP AXPOP BXRETMAIN ENDP ;结束主要部分程序CODE ENDS ;结束代码段END MAIN ;结束汇编用 MASM 程序产生.OBJ 文件操作如下:E:SY86 MASM M1.ASM
5、 M1.OBJMicrosoft(R)Macro Assembler Version 5.00Copyright(C)Microsoft Corp 1981-1985,1987. All rights reserved.Object FilenameHEXASC.OBJ:Source listing NUL.LST:Cross-reference NUL.CRF:51576+385928 Bytes symbol space free0 Warning Errors0 Severe Errors以上说明汇编过程已经完成。用 LINK 程序产生 EXE 文件操作如下:E:SY86LINK M1.
6、OBJMicrosoft(R)Overlay Linker Version 3.60Copyright(C)Microsoft Corp 1983-1987. All rights reserved.Run File M1.EXE:List File NUL.MAP:4Libraries .LIB:E:SY86LINK 程序输出 3 个文件: .EXE 文件;.LIB 库文件;.MAP 列表文件。连接过程全部完成,可以执行程序;在 TD 状态下用单步运行 F8 对 M1.EXE 文件进行调试,观察、记录结果。E:SY86TD进入 TD 调试软件后用单步执行 F8 命令从首地址开始执行指令并观察
7、相应变化。运行结果如下:F8AX=0000 BX=0000 CX=000D DX=0000 SP=2000 BP=0000 SI=0000 DI=0000 DS=17F7 ES=17F7 SS=17F7 CS=17F7 IP=0103 NV UP DI PL NZ NA PO NC17F7:0103 B80030 MOV AX,3000F8AX=3000 BX=0000 CX=000D DX=0000 SP=2000 BP=0000 SI=0000 DI=0000 DS=17F7 ES=17F7 SS=17F7 CS=17F7 IP=0106 NV UP DI PL NZ NA PO NC17
8、F7:0106 BB0050 MOV BX,5000F8AX=3000 BX=5000 CX=000D DX=0000 SP=2000 BP=0000 SI=0000 DI=0000 DS=17F7 ES=17F7 SS=17F7 CS=17F7 IP=0109 NV UP DI PL NZ NA PO NC17F7:0109 50 PUSH AXF8AX=3000 BX=5000 CX=000D DX=0000 SP=1FFE BP=0000 SI=0000 DI=0000 DS=17F7 ES=17F7 SS=17F7 CS=17F7 IP=010A NV UP DI PL NZ NA P
9、O NC17F7:010A 53 PUSH BXF8AX=3000 BX=5000 CX=000D DX=0000 SP=1FFC BP=0000 SI=0000 DI=0000 DS=17F7 ES=17F7 SS=17F7 CS=17F7 IP=010B NV UP DI PL NZ NA PO NC17F7:010B 58 POP AXF8AX=5000 BX=5000 CX=000D DX=0000 SP=1FFE BP=0000 SI=0000 DI=0000 DS=17F7 ES=17F7 SS=17F7 CS=17F7 IP=010C NV UP DI PL NZ NA PO N
10、C17F7:010C 5B POP BXF8AX=5000 BX=3000 CX=000D DX=0000 SP=2000 BP=0000 SI=0000 DI=0000DS=17F7 ES=17F7 SS=17F7 CS=17F7 IP=010D NV UP DI PL NZ NA PO NC17F7:010D F4 HLT52用以上同样的方法,完成下列程序的调试:编辑、汇编、连接、运行程序,观察、记录结果。输入以下汇编程序(分号 “;” 后面内容不需输入)用单步运行执行程序,按分号后的要求记录结果。源程序DATA SEGMENT PARA PUBLIC DATADATA ENDSSTACK
11、 SEGMENT PARA STACK STACKDB 512 DUP (?)STACK ENDSCODE SEGMENT PARA PUBLIC CODEASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX MOV AX,2000H ;AH=20HMOV DS,AX ;AL=00H DS=2000HMOV SS,AX ;SS=2000H AX=2000HMOV BX,2030H ;BH=20H BL=30HMOV SI,BX ;SI=20
12、30HMOV DI,3040H ;DI=3040HMOV SI,DI ;SI=3040HMOV SP,50FFH ;SP=50FFHMOV DX,SP ;DH=50H DL=0FFHMOV CL,25 ;CL=25(19H)MOV BL,CL ;CL=19H BL=19HMOV AH,0F0H ;AH=0F0HMOV CH,AH ;CH=0F0HMOV BYTE PTRDI,64 ;(DI)=40HMOV WORD PTRSI,256 ;(SI)=00H (SI+1)=01HMOV DL,SI+1 ;DL=01HMOV DH,1+SI ;DH=01HMOV AL,1SI ;AL=01HMOV
13、WORD PTRBXSI,34 ;(BX+SI)=22H (BX+SI+1)=00HMOV BX+SI+4,BL ;(BX+SI+4)=19HMOV BP,2BX+DI ;BP=0100HMOV BP,AL ;(BP)=01H6MOV AX,BPDI ;AX=8B00HMOV BL,AL ;BL=00HMOV ES,BX ;ES=2000HPUSH BX ;SP=50FDH (SP,SP+1)=2000HPUSH DI ;SP=50FBH (SP,SP+1)=3040HPOP CX ;SP=50FDH CX=3040HPOP DX ;SP=50FFH DX=2000HXCHG AX,BP ;A
14、X=0101H BP=8B00HXCHG DH,BL ;DH=00H BL=20HLAHF ;FLAG=NV UP DI PL NZ NA PO NC;FLAG=00000000;AH=02HSAHF ;FLAG=NV UP DI PL NZ NA PO NC;FLAG=00000000;AH=02HPUSHF ;SP=50FDH (SP,SP+1)=3102HPOPF ;SP=50FDH;FLAG= NV UP DI PL NZ NA PO NC;FLAG=00000000NOPSTART ENDPCODE ENDSEND START以文件名“E2”存盘;单步运行程序,每运行一条指令即检查相
15、应结果并予以记录;利用断点运行、跟踪运行和全速运行等功能调试程序、运行程序并检查结果。运行结果:各寄存器及内存变化如上。五思考题常用的数据传送指令有几种类型?试归纳并举例说明。答:常用的数据传送指令有四种类型:1.通用数据传送指令MOV OPRD1 ,OPRD2例:MOV AX,2000H ;AX=2000H压栈指令 PUSH OPRD出栈指令 POP OPRD例:PUSH AX ;SP=SP-2,(SP,SP+1)=AXPOP AX ;AX=(SP,SP+1),SP=SP+2交换指令 XCHG PORD1,OPRD2例:MOV AX,02FFHMOV BP,0001HXCHG AX,BP ;
16、AX=0001H,BP=02FFH2.累加器专用传送指令7输入、输出指令 IN、OUT例:IN AX,DX ;AX=( DX+1, DX)OUT DX,AX ;( DX+1, DX) =AX换码指令 XLAT例:XLAT ;AL=(BX+AL)3.地址传送指令有效地址送寄存器 LEA REG,SRC例:LEA SI ,DAT1 ;SI=ADDR(DAT1)指针送 DS 和寄存器 LDS REG,SRC例:LDS DI ,BX ;DI=(DS16+BX),DS=(DS16+BX+2)指针送 ES 和寄存器 LES REG,SRC例:LES DI,BX ;DI=(DS16+BX),ES=(DS16
17、+BX+2)4.标志寄存器传送指令标志传送指令 例:LAHF ;AHPSW 的低字节SAHF ;PSW 的低字节AH标志进、出栈 例:PUSHF ;SPSP-2,(SP+1,SP)PSWPOPF ;PSW(SP+1,SP),SPSP+28实验二:算术运算实验学时:2实验类型:设计实验要求:必修一实验目的1验证算术运算基本指令;2正确使用加、减、乘、除程序,为设计综合算术运算程序打好基础;3学习独立编程;4深入学习、掌握 TD 调试软件的使用方法。二实验器材PC 机三实验内容及步骤1加、减法运算要求调试以下程序源程序DATA SEGMENT PARA PUBLIC DATADATA ENDSST
18、ACK SEGMENT PARA STACK STACKDB 512 DUP (?)STACK ENDSCODE SEGMENT PARA PUBLIC CODEASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX MOV AX,2040H ;AH=20H , AL=40H, CF=0ADD AL,AH ;AH=20H , AL=60H, CF=0MOV CX,257 ;CX=0101H, CF=0MOV SI,AX ;SI=2060H,S
19、UB SI,CX ;SI=1F5FH, CX=010H, CF=0SUB CH,CL ;CH=00H, CL=01H, CF=09ADC AX,CX ;AX=2061H, CX=0001H, CF=0MOV WORD PTR SI,513 ;(SI,SI+1)=0201HADC SI,AL ;(SI,SI+1)=0262H, CF=0SBB AX,SI ;AX=1DFFH, CF=0INC BYTE PTR SI+1 ;(SI,SI+1)=0362HDEC BYTE PTR SI ;(SI,SI+1)=0361HDAA ;AH=1DH, AL=65H, AF=1,CF=1AAA ;AH=1EH
20、, AL=0BH, AF=1,CF=1RETSTART ENDPCODE ENDSEND START运行结果:各寄存器及内存数据如上。2加、减法程序设计要求试设计、编写程序,计算(UP1)+(UP2)-(UP3),结果存放在 DX 中。如25+48-19=?其中 UP1、UP2、UP3 的内容均为二位十进制数,并以非压缩BCD 码格式存入存储器:(UP1)= 0205H, (UP2)= 0408H, (UP3)= 0109HUP1 = 2050H, UP2 = 2150H, UP3 =2250H源程序DATA SEGMENT PARA PUBLIC DATADATA ENDSSTACK SEG
21、MENT PARA STACK STACKDB 512 DUP (?)STACK ENDSCODE SEGMENT PARA PUBLIC CODEASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX MOV AX,0000MOV DX,0000MOV SI,2050HMOV DI,2150H10MOV BP,2250HMOV WORD PTRSI,0205HMOV WORD PTRDI,0408HMOV WORD PTRBP,0109HM
22、OV AL,SI ;送被加数低 8 位ADD AL,DI ;低 8 位相加AAA ;加法 ASCII 调整MOV DL,AL ;暂存MOV AL,SI+1 ;送被加数高 8 位ADC AL,DI+1 ;带进位加AAA ;加法 ASCII 调整XCHG AL,DL ;AL 与 DL 交换SUB AL,BP ;和的低 8 位减减数的低 8 位AAS ;减法 ASCII 调整XCHG AL,DL ;AL 与 DL 交换,存低 8 位结果SBB AL,BP+1 ;高 8 位带进位减AAS ;减法 ASCII 调整MOV DH,AL ;存高 8 位结果RETSTARTENDPCODE ENDSEND S
23、TART运行结果:DX=0504H3乘法程序设计要求:试设计、编写程序,计算(A)(B)。A、B 表示内存单元,分别存放着二个用非压缩 BCD 码表示的十进制数 (如 34、56)。内存单元 (A)=04H,(A 1)=03H,内存单元(B)=06H,(B1)=05H,计算结果应为非压缩的 BCD 码表示的十进制数,存放在以 C 为首地址的 4 个连续内存字节单元中。设内存单元A=2200H、B=2220H 、C=2240H;源程序DATA SEGMENT PARA PUBLIC DATADATA ENDSSTACK SEGMENT PARA STACK STACKDB 512 DUP (?)
24、STACK ENDSCODE SEGMENT PARA PUBLIC CODEASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARPUSH DSMOV AX,0PUSH AX11MOV AX,DATAMOV DS,AXMOV ES,AX MOV AX,0MOV BX,0MOV DI,223AHMOV SI,2230HMOV AL,04H ;被乘数低 8 位送 ALMOV BL,06H ;乘数低 8 位送 BLMUL BL ;相乘,AL=18H,CF=0AAM ;调整,AH=02H,AL=04HMOV WORD PTR DI,AX ;存结果,
25、(DI,DI +1)= 04H,02HMOV AL,03H ;被乘数高 8 位送 ALMUL BL ;被乘数高 8 位乘以乘数低 8 位,AL=12H,CF=0AAM ;调整,AH=01H,AL=08HADD AL,DI+1 ;部分积相加,AL=0AHAAA ;调整,AH=02H,AL=00H,AF=1,CF=1MOV WORD PTR DI+1,AX ;存结果,(DI +1 ,DI +2)= 00H ,02HMOV AL,04H ;被乘数低 8 位送 ALMOV BL,05H ;乘数高 8 位送 BLMUL BL ;相乘,AL=14HAAM ;调整,AH=02H,AL=00HMOV WORD
26、 PTRSI,AX ;存结果,(SI,SI +1)= 00H,02HMOV AL, 03H ;被乘数高 8 位送 ALMUL BL ;被乘数高 8 位乘以乘数高 8 位,AL=0FHAAM ;调整,AH=01H,AL=05HADD AL,SI+1 ;部分积相加,AL=07HAAA ;调整,AH=01H,AL=07H,AF=0,CF=0MOV WORD PTR SI+1,AX ;存结果,(SI+1,SI +2)= 07H,01HMOV AL,DI ;AL=04HMOV BP,2240H ;乘积首址 2240HMOV BP,AL ;存积低位,(2240H)=04HMOV AL,DI+1ADD AL
27、.SI+1AAA ;调整,AH=01H,AL=00H,AF=0,CF=0MOV BP+1,AL ;存积低位加 1,(2241H)=00HMOV AL,DI+2 ;AL=02HADC AL,SI+1 ;AL=09H,AF=0,CF=0AAA ;调整,AH=01H,AL=09HMOV BP+2,AL ;存积低位加 2,(2242H)=09HMOV AL,0ADC AL,SI+2 ;AL=01H,AF=0,CF=0AAA ;调整,AH=01H,AL=01H12MOV BP+3,AL ;存积高位,(2243H)=01HRETSTARTENDPCODE ENDSEND START运行结果:(2243H)
28、=01H,(2242H)=09H,(2241H)=00H,(2240H)=04H;积=1904H4除法程序设计(选做)要求试设计、编写程序,计算(A)(B),A、B 表示内存单元,数据自定。其中除数(B) 是 16 位十六进制数,存放在 BX 中;被除数 (A)是 32 位十六进制数,高16 位存放在 DX,低 16 位存放在 AX 中;结果为 32 位十六进制数的商存放在BX:AX 中;16 位十六进制余数存放在 DX 中。设置数据时如果除数等于零或者商大于 16 位,则应考虑溢出处理。源程序(避免溢出的除法程序)STACK SEGMENT PARA STACK STACKDW32 DUP(
29、0)STACK ENDSDATA SEGMENT PARA DATADATA ENDSCODE SEGMENT PARA CODEASSUME CS:CODE,DS:DATA,SS:STACKDIVUO PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV AX,1FCDH ;被除数低 16 位MOV DX,3B78H ;被除数高 16 位MOV BX,7C9AH ;16 位除数CMP BX,0 ;除数=0?JNZ DVROK ;不为零,转DIV BX ;为零,除JMP SHORT GO_DOSDVROK: PUSH ESPUSH DIPU
30、SH CXMOV DI,0 ;取出当前的 INT 0 向量并保存之MOV ES,DIPUSH ES:DIPUSH ES:DI+213LEA CX,OVR_INT ;获得 INT 0 向量MOV ES:DI,CXMOV CX,SEG OVR_INTMOV ES:DI+2,CXDIV BX ;做除法SUB BX,BXRESTORE:POP ES:DI+2 ;恢复 INT 0 向量POP ES:DIPOP CXPOP DIPOP ESGO_DOS:RETOVR_INT:POP CXLEA CX,RESTOREPUSH CXPUSH AXMOV AX,DXSUB DX,DXDIV BXPOP CXPU
31、SH AXMOV AX,CXDIV BXPOP BXIRETDIVUO ENDPCODE ENDSEND DIVUO运行结果:商 BX:AX=7A2EH,余数 DX=5821H程序流程框图放除数、被除数除数为 0?INT0 中断有溢出?做除法INT0 中断转 OVR-INT 处理YYNN开始14四思考题1若对两个带符号的双精度数作加、减法运算,该怎样处理。 答:如果对两个带符号的双精度数作加、减法运算,则运算应按照带符号的加、减法考虑。2在编写乘法程序时,若(B)是一个带符号非压缩的 BCD 码,则程序应该怎样编写。答:如果乘数是一个带符号非压缩的 BCD 码,则运算应按照带符号的乘法考虑。首
32、先保存被乘数和乘数的符号位,正常运算后,在结果加上符号位。结束15实验三:代码转换实验学时:2实验类型:设计实验要求:必修一实验目的1设计常见的代码转换程序,通过实际操作,调试并检验所设计程序的正确性;2提高独立编程的能力。二实验器材PC 机三实验内容1十六进制数ASCII 码要求:试设计、编写程序,将一个十六进制数 0FBE9H 转换为 ASCII 码并在屏幕上显示出来。源程序NAME HEXASCDATA SEGMENT PARA PUBLIC DATAHEX DW 0EBF9HASC DB 20 DUP(0)DATA ENDSSTACK SEGMENT PARA STACK STACKD
33、B 512 DUP (?)STACK ENDSCODE SEGMENT PARA PUBLIC CODEASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX MOV CX,0004HMOV AX, HEX ;取十六进制数 0EBF9HLEA BX,ASC16AA: PUSH CXMOV CL,04H ;给循环计数器赋转换代码长度ROL AX,CL ;十六进制数循环左移PUSH AXAND AX,000FHCMP AL,0AH ;判别是否为“
34、09”JB ASCII ;是“09”转 ASCIIADD AL,07HASCII: ADD AL,30HMOV DH,ALMOV CL,04H ;给循环计数器赋转换代码长度SHR DH,CL ;逻辑右移MOV DL,ALAND DX,0F0FHOR DX,3030HMOV BX,DH ;(BX)=46H,(BX)=42H,(BX)=45H, (BX)=39H,INC BXMOV BX,DLINC BXPOP AXPOP CXLOOP AAMOV AL,$MOV BX,ALMOV AH,09HLEA DX,ASCINT 21HRETSTART ENDPCODE ENDSEND START在 TD
35、 状态下分别用单步执行、全速运行对 HEXASC.EXE 文件进行调试、运行,结果正确;在 DOS 状态下运行可执行文件 HEXASC.EXE,结果正确。屏幕显示:45424639。2ASCII 码BCD 码要求:试设计、编写程序,完成以下功能。设有一组 ASCII 码数据:3332H,3537H,3946H,3239H,3642H,存放在起始地址为 DS:150H 的连续内存单元内,数组长度存入 CX 。经过转换后的 BCD 码存放在起始地址为 DS:160H 的连续内存续单元内,如果待转换的数据不是十进制数的 ASCII 码,则对应的结果单元存放“0FFH”。17源程序NAME ASCBC
36、DDATA SEGMENT PARA PUBLICDATAORG 0150HDATA1 DW 3332H,3537H,3946H,3239H,3642HORG 0160HDB 10 DUP(?)DATA ENDSSTACK SEGMENT PARA STACKSTACKDB 512 DUP(?)STACK ENDSCODE SEGMENT PARA PUBLICCODEASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX MOV CX,0A
37、H ;循环计数器赋转换代码数组长度LEA DI,DATA1 ;ASCII 首址送 DILEA SI,DATA2 ;BCD 首址送 SIBB: MOV BL,0FFH ;错误标志 BLMOV AL,DI ;ASCII 码送 ALCMP AL,3AH ;检查是否为大于 9 的 ASCII 码JNB DONE ;是转 DONESUB AL,30H ;不是,取 ASCII 码低 4 位JB DONE ;小于 0 的十进制数,转 DONEMOV BL,AL ;BCD 码送 BLDONE:MOV AL,BL ;错误标志或结果送 ALMOV SI,AL ;转换结果送 BCD 数据区INC DIINC SIL
38、OOP BB ;(CX)不为 0,转 BBRETSTART ENDPCODE ENDSEND START运行结果:从 DS:160H 开始的连续内存单元的 BCD 码数据为:02,03,07,05,0FF ,09,09, 02,0FF ,06,。18程序流程框图3BCD 码 二进制要求:试设计、编写程序,完成以下功能。有一组非压缩的 BCD 码数据存放在起始地址为 DS:180H 的连续内存单元内,数组长度存入 CX。经过转换后的二进制数存放在起始地址为 DS:190H 的连续内存单元内。非压缩的 BCD 码数据如下:0802,0103,0009,0706,0407,。源程序NAME BCD2
39、DATA SEGMENTASCII 首址送 DI待转换数39H?取待转换数CX-1=0?BCD 首址送 SI待转换数减 30H结束置错误标志 0FFHYYNN开始存转换结果SISI+1DIDI+1数组长度送 CX19ORG 0180HDAT1 DW 0802H,0103H,0009H,0706H,0407HORG 0190HDAT2 DB 10 DUP(?)DATA ENDSSTACK SEGMENT PARA STACKSTACKDB 512 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART PR
40、OC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AX MOV ES,AX MOV CX,05H ;循环计数器赋转换代码长度LEA DI,DAT1 ;BCD 码首址送 DILEA SI,DAT2 ;二进制首址送 SIXL: MOV AL,DI+1 ;BCD 码十位数值赋 ALMOV BL,0AHMUL BL ;乘 10INC DIMOV AH,00HADD AX,DI ;BCD 码十位和个位相加,转换结束MOV SI,AL ;转换结果存二进制起始地址INC DIINC DIINC SI ;(CX)不为 0 转 AALOOP XLRETSTART END
41、PCODE ENDSEND START运行结果:从 DS:190H 开始的连续内存单元的二进制数据为:52H,0DH,09H,4CH,2FH,。20程序流程框图四思考题1对以上几种代码转换的方法,除了你已调试通过的程序外,还有没有其它的方法实现转换?至少再列举一种程序。答:对 BCD 码转换为二进制, BCD 码的十位数乘以 10 再加上 BCD 码的个位数可用以下语句实现转换:MOV BH,00HMOV BL,ALMOV AL,AHMOV AH,00HMOV CL,10MUL CLBCD 首址送 DICX数据长度二进制数首址送 SI开始AL BCD 码十位数存结果AL 乘以 10 后与BCD
42、 码个位数相加SISI+1DIDI+1CX-1=0?结束YN21ADD AX,BX实验四:程序的基本结构练习实验学时:3实验类型:设计实验要求:必修一实验目的1熟悉程序设计中的查表、分支与循环和排序等方法;2进行综合程序设计练习,巩固汇编语言设计和调试能力。二实验器材PC 机三实验内容1查表处理 要求:试设计、编写程序,完成数组查表处理。设有一组首地址为 list 的字数组:12,11H,22H,33H,44H,55H,66H,77H,88H,99H ,111H ,222H,333H,该数组的第一个字中放着数组长度,将该数组的首地址存放到 DI 寄存器中。程序运行之前在 AX 寄存器中存放一个
43、数,如(AX)=55H,要求在数组中查找该数。如果找到此数就把它从数组中删除,如果没有找到则不对数组作任何处理退出程序。源程序DATA SEGMENTLIST DW 12,11H,22H,33H,44H,55H,66H,77H,88H,99H,111H,222H,333H DATA ENDSCODE SEGMENTDEL_UL PROC FARASSUME CS:CODE,DS:DATA,ES:DATAMAIN: PUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,55HCLD ;使 DF=0,执行串处理指令时地址自动增量LEA
44、 DI, LIST ;取得数据区首地址PUSH DI22MOV CX,ES:DI ;取数组长度,CX=000CHADD DI,2 ;数组首址REPNE SCASW ;字符串比较JE DELETE ;字符相同转移JMP SHORT EXIT ;字符不同转 EXIT,不做处理DELETE: JCXZ DEC_CNT;CX 寄存器内容为 0 则到数据区尾转结束NEXT_EL: MOV BX,ES:DIMOV ES:DI-2,BXADD DI,2LOOP NEXT_EL DEC_CNT: POP DIDEC WORD PTR ES:DIEXIT: RETDEL_UL ENDPCODE ENDSEND MAIN运行结果:可正确查找到 AX 寄存器中存放的数据并作出处理。