目 录
实验一 数据传送............................................................................................. 2
实验二 算术运算............................................................................................. 8
实验三 代码转换........................................................................................... 14
实验四 程序的基本结构练习....................................................................... 20
实验五 存储器(RAM 6264)扩展............................................................. 25
实验六 可编程并行接口(8255)扩展....................................................... 28
实验七 可编程计数/定时器(8253)扩展.................................................. 34
实验八 A/D、D/A转换................................................................................ 45
实验九 可编程串行通信接口(8251)扩展............................................... 53
实验学时:2
实验类型:验证
实验要求:必修
1.学习程序设计的基本方法和技能,掌握用汇编语言设计、编写、调试和运行程序的方法;
学习用全屏幕编辑软件QEDIT.EXE建立源程序(.ASM文件);
学习用汇编软件MASM.EXE对源文件汇编产生目标文件(.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调试、运行程序,观察、记录结果。
1.进入子目录E:>\SY86后,利用QEDIT.EXE(简称Q)送入以下汇编语言源程序,并以 M1.ASM文件存盘
⑴汇编语言程序的上机过程
①进入\SY86子目录
E:>CD\SY868
E:\SY86>
②进入QEDIT.EXE 编辑界面
E:\SY86> Q8
③输入文件名*.ASM(如M1.ASM)后,输入源程序
源程序
DATA SEGMENT PARA PUBLIC’DATA’ ;数据段定义
DB 512 DUP(0)
DATA ENDS
STACK SEGMENT PARA STACK’STACK’ ;堆栈段定义
DB 512 DUP( ?)
STACK ENDS
CODE SEGMENT PARA PUBLIC’CODE’ ;代码段定义
ASSUME CS :CODE,DS :DATA,ES:DATA,SS :STACK
MAIN
PROC FAR ;定义过程程序
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV SP,2000h
MOV AX,3000h
MOV BX,5000h
PUSH AX
PUSH BX
POP AX
POP BX
RET
MAIN ENDP ;结束主要部分程序
CODE ENDS ;结束代码段
END MAIN ;结束汇编
⑵用MASM程序产生.OBJ文件
操作如下:
E:\SY86> MASM M1.ASM M1.OBJ8
Microsoft(R)Macro Assembler Version 5.00
Copyright(C)Microsoft Corp 1981-1985,1987. All rights reserved.
Object Filename [HEXASC.OBJ]:8
Source listing [NUL.LST]:8
Cross-reference [NUL.CRF]:8
51576+385928 Bytes symbol space free
0 Warning Errors
0 Severe Errors
以上说明汇编过程已经完成。
⑶用LINK程序产生EXE文件
操作如下:
E:\SY86>LINK M1.OBJ8
Microsoft(R)Overlay Linker Version 3.60
Copyright(C)Microsoft Corp 1983-1987. All rights reserved.
Run File [M1.EXE]:8
List File [NUL.MAP]:8
Libraries [.LIB]:8
E:\SY86>
LINK程序输出3个文件:.EXE文件;.LIB库文件;.MAP列表文件。连接过程全部完成,可以执行程序;
⑷在TD状态下用单步运行F8对M1.EXE文件进行调试,观察、记录结果。
E:\SY86>TD8
进入TD调试软件后用单步执行F8命令从首地址开始执行指令并观察相应变化。运行结果如下:
―F88
AX=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 NC
17F7:0103 B80030 MOV AX,3000
―F88
AX=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 NC
17F7:0106 BB0050 MOV BX,5000
―F88
AX=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 NC
17F7:0109 50 PUSH AX
―F88
AX=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 PO NC
17F7:010A 53 PUSH BX
―F88
AX=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 NC
17F7:010B 58 POP AX
―F88
AX=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 NC
17F7:010C 5B POP BX
―F88
AX=5000 BX=3000 CX=000D DX=0000 SP=2000 BP=0000 SI=0000 DI=0000
DS=17F7 ES=17F7 SS=17F7 CS=17F7 IP=010D NV UP DI PL NZ NA PO NC
17F7:010D F4 HLT
―
2.用以上同样的方法,完成下列程序的调试:编辑、汇编、连接、运行程序,观察、记录结果。
⑴输入以下汇编程序(分号 “;” 后面内容不需输入)用单步运行执行程序,按分号后的要求记录结果。
源程序
DATA SEGMENT PARA PUBLIC ‘DATA’
DATA ENDS
STACK SEGMENT PARA STACK ‘STACK’
DB 512 DUP (?)
STACK ENDS
CODE SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,2000H ;AH=20H
MOV DS,AX ;AL=00H DS=2000H
MOV SS,AX ;SS=2000H AX=2000H
MOV BX,2030H ;BH=20H BL=30H
MOV SI,BX ;SI=2030H
MOV DI,3040H ;DI=3040H
MOV SI,DI ;SI=3040H
MOV SP,50FFH ;SP=50FFH
MOV DX,SP ;DH=50H DL=0FFH
MOV CL,25 ;CL=25(19H)
MOV BL,CL ;CL=19H BL=19H
MOV AH,0F0H ;AH=0F0H
MOV CH,AH ;CH=0F0H
MOV BYTE PTR[DI],64 ;(DI)=40H
MOV WORD PTR[SI],256 ;(SI)=00H (SI+1)=01H
MOV DL,[SI+1] ;DL=01H
MOV DH,1+[SI] ;DH=01H
MOV AL,1[SI] ;AL=01H
MOV WORD PTR[BX][SI],34 ;(BX+SI)=22H (BX+SI+1)=00H
MOV [BX+SI+4],BL ;(BX+SI+4)=19H
MOV BP,2[BX+DI] ;BP=0100H
MOV [BP],AL ;(BP)=01H
MOV AX,[BP][DI] ;AX=8B00H
MOV BL,AL ;BL=00H
MOV ES,BX ;ES=2000H
PUSH BX ;SP=50FDH (SP,SP+1)=2000H
PUSH DI ;SP=50FBH (SP,SP+1)=3040H
POP CX ;SP=50FDH CX=3040H
POP DX ;SP=50FFH DX=2000H
XCHG AX,BP ;AX=0101H BP=8B00H
XCHG DH,BL ;DH=00H BL=20H
LAHF ;FLAG=NV UP DI PL NZ NA PO NC
;FLAG=00000000
;AH=02H
SAHF ;FLAG=NV UP DI PL NZ NA PO NC ;FLAG=00000000
;AH=02H
PUSHF ;SP=50FDH (SP,SP+1)=3102H
POPF ;SP=50FDH
;FLAG= NV UP DI PL NZ NA PO NC
;FLAG=00000000
NOP
START ENDP
CODE ENDS
END START
⑵以文件名“E2”存盘;
⑶单步运行程序,每运行一条指令即检查相应结果并予以记录;
⑷利用断点运行、跟踪运行和全速运行等功能调试程序、运行程序并检查结果。
——运行结果:各寄存器及内存变化如上。
常用的数据传送指令有几种类型?试归纳并举例说明。
答:常用的数据传送指令有四种类型:
1.通用数据传送指令
⑴MOV OPRD1,OPRD2
例:MOV AX,2000H ;AX=2000H
⑵压栈指令 —— PUSH OPRD
出栈指令 —— POP OPRD
例:PUSH AX ;SP=SP-2,(SP,SP+1)=AX
POP AX ;AX=(SP,SP+1),SP=SP+2
⑶交换指令 —— XCHG PORD1,OPRD2
例:MOV AX,02FFH
MOV BP,0001H
XCHG AX,BP ;AX=0001H,BP=02FFH
2.累加器专用传送指令
⑴输入、输出指令 —— 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=(DS×16+BX),DS=(DS×16+BX+2)
⑶指针送ES和寄存器 —— LES REG,SRC
例:LES DI,[BX] ;DI=(DS×16+BX),ES=(DS×16+BX+2)
4.标志寄存器传送指令
⑴标志传送指令
例:LAHF ;AH←PSW的低字节
SAHF ;PSW的低字节←AH
⑵标志进、出栈
例:PUSHF ;SP←SP-2,(SP+1,SP)←PSW
POPF ;PSW←(SP+1,SP),SP←SP+2
实验学时:2
实验类型:设计
实验要求:必修
1.验证算术运算基本指令;
2.正确使用加、减、乘、除程序,为设计综合算术运算程序打好基础;
3.学习独立编程;
4.深入学习、掌握TD调试软件的使用方法。
PC机
1.加、减法运算
⑴要求
调试以下程序
源程序
DATA SEGMENT PARA PUBLIC ‘DATA’
DATA ENDS
STACK SEGMENT PARA STACK ‘STACK’
DB 512 DUP (?)
STACK ENDS
CODE SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,2040H ;AH=20H , AL=40H, CF=0
ADD AL,AH ;AH=20H , AL=60H, CF=0
MOV CX,257 ;CX=0101H, CF=0
MOV SI,AX ;SI=2060H,
SUB SI,CX ;SI=1F5FH, CX=010H, CF=0
SUB CH,CL ;CH=00H, CL=01H, CF=0
ADC AX,CX ;AX=2061H, CX=0001H, CF=0
MOV WORD PTR [SI],513 ;(SI,SI+1)=0201H
ADC [SI],AL ;(SI,SI+1)=0262H, CF=0
SBB AX,[SI] ;AX=1DFFH, CF=0
INC BYTE PTR [SI+1] ;(SI,SI+1)=0362H
DEC BYTE PTR [SI] ;(SI,SI+1)=0361H
DAA ;AH=1DH, AL=65H, AF=1,CF=1
AAA ;AH=1EH, AL=0BH, AF=1,CF=1
RET
START ENDP
CODE ENDS
END START
——运行结果:各寄存器及内存数据如上。
2.加、减法程序设计
⑴要求
试设计、编写程序,计算(UP1)+(UP2)-(UP3),结果存放在DX中。如25+48-19=?其中UP1、UP2、UP3的内容均为二位十进制数,并以非压缩BCD码格式存入存储器:
(UP1)= 0205H, (UP2)= 0408H, (UP3)= 0109H
UP1 = 2050H, UP2 = 2150H, UP3 =2250H
源程序
DATA SEGMENT PARA PUBLIC ‘DATA’
DATA ENDS
STACK SEGMENT PARA STACK ‘STACK’
DB 512 DUP (?)
STACK ENDS
CODE SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,0000
MOV DX,0000
MOV SI,2050H
MOV DI,2150H
MOV BP,2250H
MOV WORD PTR[SI],0205H
MOV WORD PTR[DI],0408H
MOV WORD PTR[BP],0109H
MOV 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位结果
RET
START ENDP
CODE ENDS
END START
——运行结果:DX=0504H
3.乘法程序设计
要求:
试设计、编写程序,计算(A)×(B)。A、B表示内存单元,分别存放着二个用非压缩BCD码表示的十进制数(如34、56)。内存单元(A)=04H,(A+1)=03H,内存单元(B)=06H,(B+1)=05H,计算结果应为非压缩的BCD码表示的十进制数,存放在以C为首地址的4个连续内存字节单元中。设内存单元A=2200H、B=2220H、C=2240H;
源程序
DATA SEGMENT PARA PUBLIC ‘DATA’
DATA ENDS
STACK SEGMENT PARA STACK ‘STACK’
DB 512 DUP (?)
STACK ENDS
CODE SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,0
MOV BX,0
MOV DI,223AH
MOV SI,2230H
MOV AL,04H ;被乘数低8位送AL
MOV BL,06H ;乘数低8位送BL
MUL BL ;相乘,AL=18H,CF=0
AAM ;调整,AH=02H,AL=04H
MOV WORD PTR [DI],AX ;存结果,(DI,DI +1)= 04H,02H
MOV AL,03H ;被乘数高8位送AL
MUL BL ;被乘数高8位乘以乘数低8位,AL=12H,CF=0
AAM ;调整,AH=01H,AL=08H
ADD AL,[DI+1] ;部分积相加,AL=0AH
AAA ;调整,AH=02H,AL=00H,AF=1,CF=1
MOV WORD PTR [DI+1],AX ;存结果,(DI +1,DI +2)= 00H,02H
MOV AL,04H ;被乘数低8位送AL
MOV BL,05H ;乘数高8位送BL
MUL BL ;相乘,AL=14H
AAM ;调整,AH=02H,AL=00H
MOV WORD PTR[SI],AX ;存结果,(SI,SI +1)= 00H,02H
MOV AL, 03H ;被乘数高8位送AL
MUL BL ;被乘数高8位乘以乘数高8位,AL=0FH
AAM ;调整,AH=01H,AL=05H
ADD AL,[SI+1] ;部分积相加,AL=07H
AAA ;调整,AH=01H,AL=07H,AF=0,CF=0
MOV WORD PTR [SI+1],AX ;存结果,(SI+1,SI +2)= 07H,01H
MOV AL,[DI] ;AL=04H
MOV BP,2240H ;乘积首址2240H
MOV [BP],AL ;存积低位,(2240H)=04H
MOV AL,[DI+1]
ADD AL.[SI+1]
AAA ;调整,AH=01H,AL=00H,AF=0,CF=0
MOV [BP+1],AL ;存积低位加1,(2241H)=00H
MOV AL,[DI+2] ;AL=02H
ADC AL,[SI+1] ;AL=09H,AF=0,CF=0
AAA ;调整,AH=01H,AL=09H
MOV [BP+2],AL ;存积低位加2,(2242H)=09H
MOV AL,0
ADC AL,[SI+2] ;AL=01H,AF=0,CF=0
AAA ;调整,AH=01H,AL=01H
MOV [BP+3],AL ;存积高位,(2243H)=01H
RET
START ENDP
CODE ENDS
END START
——运行结果:(2243H)=01H,(2242H)=09H,(2241H)=00H,(2240H)=04H;积=1904H
4.除法程序设计(选做)
⑴要求
试设计、编写程序,计算(A)/(B),A、B表示内存单元,数据自定。其中除数(B)是16位十六进制数,存放在BX中;被除数(A)是32位十六进制数,高16位存放在DX,低16位存放在AX中;结果为32位十六进制数的商存放在BX:AX中;16位十六进制余数存放在DX中。
设置数据时如果除数等于零或者商大于16位,则应考虑溢出处理。
源程序(避免溢出的除法程序)
STACK SEGMENT PARA STACK 'STACK'
DW 32 DUP(0)
STACK ENDS
DATA SEGMENT PARA 'DATA'
DATA ENDS
CODE SEGMENT PARA 'CODE'
ASSUME CS:CODE,DS:DATA,SS:STACK
DIVUO PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,1FCDH ;被除数低16位
MOV DX,3B78H ;被除数高16位
MOV BX,7C9AH ;16位除数
CMP BX,0 ;除数=0?
JNZ DVROK ;不为零,转
DIV BX ;为零,除
JMP SHORT GO_DOS
DVROK: PUSH ES
PUSH DI
PUSH CX
MOV DI,0 ;取出当前的INT 0向量并保存之
MOV ES,DI
PUSH ES:[DI]
PUSH ES:[DI+2]
LEA CX,OVR_INT ;获得INT 0向量
MOV ES:[DI],CX
MOV CX,SEG OVR_INT
MOV ES:[DI+2],CX
DIV BX ;做除法
SUB BX,BX
RESTORE:
POP ES:[DI+2] ;恢复 INT 0 向量
POP ES:[DI]
POP CX
POP DI
POP ES
GO_DOS:
RET
OVR_INT:
POP CX
LEA CX,RESTORE
PUSH CX
PUSH AX
MOV AX,DX
SUB DX,DX
DIV BX
POP CX
PUSH AX
MOV AX,CX
DIV BX
POP BX
IRET
DIVUO ENDP
CODE ENDS
END DIVUO
——运行结果:商BX:AX=7A2EH,余数DX=5821H
程序流程框图
1.若对两个带符号的双精度数作加、减法运算,该怎样处理。
答:如果对两个带符号的双精度数作加、减法运算,则运算应按照带符号的加、减法考虑。
2.在编写乘法程序时,若(B)是一个带符号非压缩的BCD码,则程序应该怎样编写。
答:如果乘数是一个带符号非压缩的BCD码,则运算应按照带符号的乘法考虑。首先保存被乘数和乘数的符号位,正常运算后,在结果加上符号位。
实验学时:2
实验类型:设计
实验要求:必修
1.设计常见的代码转换程序,通过实际操作,调试并检验所设计程序的正确性;
2.提高独立编程的能力。
PC机
1.十六进制数→ASCII码
要求:
试设计、编写程序,将一个十六进制数0FBE9H转换为ASCII码并在屏幕上显示出来。
源程序
NAME HEXASC
DATA SEGMENT PARA PUBLIC 'DATA'
HEX DW 0EBF9H
ASC DB 20 DUP(0)
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 512 DUP (?)
STACK ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV CX,0004H
MOV AX, HEX ;取十六进制数0EBF9H
LEA BX,ASC
AA: PUSH CX
MOV CL,04H ;给循环计数器赋转换代码长度
ROL AX,CL ;十六进制数循环左移
PUSH AX
AND AX,000FH
CMP AL,0AH ;判别是否为“0~9”
JB ASCII ;是“0~9”转ASCII
ADD AL,07H
ASCII: ADD AL,30H
MOV DH,AL
MOV CL,04H ;给循环计数器赋转换代码长度
SHR DH,CL ;逻辑右移
MOV DL,AL
AND DX,0F0FH
OR DX,3030H
MOV [BX],DH ;(BX)=46H,(BX)=42H,(BX)=45H, (BX)=39H,
INC BX
MOV [BX],DL
INC BX
POP AX
POP CX
LOOP AA
MOV AL,'$'
MOV [BX],AL
MOV AH,09H
LEA DX,ASC
INT 21H
RET
START ENDP
CODE ENDS
END START
——在TD状态下分别用单步执行、全速运行对HEXASC.EXE文件进行调试、运行,结果正确;
——在DOS状态下运行可执行文件HEXASC.EXE,结果正确。屏幕显示:45424639。
2.ASCII码→BCD码
要求:
试设计、编写程序,完成以下功能。设有一组ASCII码数据:3332H,3537H,3946H,3239H,3642H,…,存放在起始地址为DS:150H的连续内存单元内,数组长度存入CX 。经过转换后的BCD码存放在起始地址为DS:160H的连续内存续单元内,如果待转换的数据不是十进制数的ASCII码,则对应的结果单元存放“0FFH”。
源程序
NAME ASCBCD
DATA SEGMENT PARA PUBLIC'DATA'
ORG 0150H
DATA1 DW 3332H,3537H,3946H,3239H,3642H
ORG 0160H
DB 10 DUP(?)
DATA ENDS
STACK SEGMENT PARA STACK'STACK'
DB 512 DUP(?)
STACK ENDS
CODE SEGMENT PARA PUBLIC'CODE'
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV CX,0AH ;循环计数器赋转换代码数组长度
LEA DI,DATA1 ;ASCII首址送DI
LEA SI,DATA2 ;BCD首址送SI
BB:
MOV BL,0FFH ;错误标志BL
MOV AL,[DI] ;ASCII码送AL
CMP AL,3AH ;检查是否为大于9的ASCII码
JNB DONE ;是转DONE
SUB AL,30H ;不是,取ASCII码低4位
JB DONE ;小于0的十进制数,转DONE
MOV BL,AL ;BCD码送BL
DONE:
MOV AL,BL ;错误标志或结果送AL
MOV [SI],AL ;转换结果送BCD数据区
INC DI
INC SI
LOOP BB ;(CX)不为0,转BB
RET
START ENDP
CODE ENDS
END START
——运行结果:从DS:160H开始的连续内存单元的BCD码数据为:
02,03,07,05,0FF,09,09,02,0FF,06,…。
程序流程框图
3.BCD码→二进制
要求:
试设计、编写程序,完成以下功能。有一组非压缩的BCD码数据存放在起始地址为DS:180H的连续内存单元内,数组长度存入CX。经过转换后的二进制数存放在起始地址为DS:190H的连续内存单元内。
非压缩的BCD码数据如下:
0802,0103,0009,0706,0407,…。
源程序
NAME BCD2
DATA SEGMENT
ORG 0180H
DAT1 DW 0802H,0103H,0009H,0706H,0407H
ORG 0190H
DAT2 DB 10 DUP(?)
DATA ENDS
STACK SEGMENT PARA STACK'STACK'
DB 512 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV CX,05H ;循环计数器赋转换代码长度
LEA DI,DAT1 ;BCD码首址送DI
LEA SI,DAT2 ;二进制首址送SI
XL: MOV AL,[DI+1] ;BCD码十位数值赋AL
MOV BL,0AH
MUL BL ;乘10
INC DI
MOV AH,00H
ADD AX,[DI] ;BCD码十位和个位相加,转换结束
MOV [SI],AL ;转换结果存二进制起始地址
INC DI
INC DI
INC SI ;(CX)不为0转AA
LOOP XL
RET
START ENDP
CODE ENDS
END START
——运行结果:从DS:190H开始的连续内存单元的二进制数据为:
52H,0DH,09H,4CH,2FH,…。
程序流程框图
1.对以上几种代码转换的方法,除了你已调试通过的程序外,还有没有其它的方法实现转换?至少再列举一种程序。
答:对BCD码转换为二进制,BCD码的十位数乘以10再加上BCD码的个位数可用以下语句实现转换:
…
MOV BH,00H
MOV BL,AL
MOV AL,AH
MOV AH,00H
MOV CL,10
MUL CL
ADD AX,BX
…
实验学时:3
实验类型:设计
实验要求:必修
1.熟悉程序设计中的查表、分支与循环和排序等方法;
2.进行综合程序设计练习,巩固汇编语言设计和调试能力。
PC机
1.查表处理
要求:
试设计、编写程序,完成数组查表处理。
设有一组首地址为list的字数组:12,11H,22H,33H,44H,55H,66H,77H,88H,99H,111H,222H,333H,该数组的第一个字中放着数组长度,将该数组的首地址存放到DI寄存器中。程序运行之前在AX寄存器中存放一个数,如(AX)=55H,要求在数组中查找该数。如果找到此数就把它从数组中删除,如果没有找到则不对数组作任何处理退出程序。
源程序
DATA SEGMENT
LIST DW 12,11H,22H,33H,44H,55H,66H,77H,88H,99H,111H,222H,333H
DATA ENDS
CODE SEGMENT
DEL_UL PROC FAR
ASSUME CS:CODE,DS:DATA,ES:DATA
MAIN: PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,55H
CLD ;使DF=0,执行串处理指令时地址自动增量
LEA DI, LIST ;取得数据区首地址
PUSH DI
MOV CX,ES:[DI] ;取数组长度,CX=000CH
ADD DI,2 ;数组首址
REPNE SCASW ;字符串比较
JE DELETE ;字符相同转移
JMP SHORT EXIT ;字符不同转EXIT,不做处理
DELETE: JCXZ DEC_CNT ;CX寄存器内容为0则到数据区尾转结束
NEXT_EL: MOV BX,ES:[DI]
MOV ES:[DI-2],BX
ADD DI,2
LOOP NEXT_EL
DEC_CNT: POP DI
DEC WORD PTR ES:[DI]
EXIT: RET
DEL_UL ENDP
CODE ENDS
END MAIN
——运行结果:可正确查找到AX寄存器中存放的数据并作出处理。
目录实验一数据传送2实验二算术运算8实验三代码转换15实验四程序的基本结构练习21实验五存储器RAM6264扩展错误未定义书签实验…
实验一、认识Tddebug集成操作软件一.实验内容(一)实验题目:数据传送实验1.编程将数据段中的一个字符串传送到附加段中,并输出…
实验一熟悉汇编语言程序开发过程一实验目的1熟悉与实验有关的系统软件如编辑程序汇编程序连接程序和调试器等的使用2在程序调试过程中学习…
微机原理与接口技术实验报告姓名专业班级学号指导教师计算机科学与技术安徽工业大学计算机学院20xx年5月21日微机原理与接口技术实验…
微机原理与接口技术实验报告学院计算机与通信工程学院专业计算机科学与技术班级学号姓名实验一8259中断控制器应用实验一实验目的1掌握…
微机原理与接口技术实验总结11107108徐寒黎一、实验内容以及设计思路1、①试编写一程序,比较两个字符串STRING1、STRI…
微机原理与接口技术试验学习总结本学期微机原理的实验课程即将结束关于微机原理课程实验的心得体会颇多初学微机原理时感觉摸不着头绪面对着…
SDU微机原理与接口技术实验报告梁聚仁20xx00120xx0微机原理与接口技术实验报告实验一上机练习实验目的1掌握用编辑软件编辑…
《微机原理与接口技术》课程设计报告交通灯控制系统班级:学号:姓名:指导教师:成绩:xxxx年x月x日目录1、课程设计的目的和要求3…
微机原理与接口技术班级组员实验报告实验二74HC138译码器实验1编写程序使用82C55的PC0PC1PC2控制74HC138的数…
微机原理与应用课程实验报告实验分工报告人同组人实验时间20xx1210课程设计一题目要求1在数据段首址为0100H开始的内存区1按…