ADD A,DPL ;2*元素序号低字节 +DPL MOV DPL,A ;存入DPL MOV A,DPH
ADDC A,R5 ;2*元素序号高字节+DPL MOV DPH,A ;存入DPH CLR A ;清零A
MOVC A,@A+DPTR ;查表的元素高字节 MOV R5,A ;存入R5 MOV A,#01H
MOVC A,@A+DPTR ;查表的元素低字节 MOV R4,A ;存入R4 RET ;返回主程
DTATAB: DW --- ;元素表格,高字节在前 DW---- - - . END
4.16 设MDA和MDB内有两数a和b,请编写球c=a^2+b^2并把c送入MDC的程序。设a和b均为小于10整数。
程序如下:
ORG 1000H MDA DATA 20H MDB DATA 21H MDC DATA 22H
MOV A,MDA ;入口参数a送A ACALL SQR ;求b^2
ADD A, R1 ;a^2+b^2送A MOV MDC,A ;存入MDC SJMP $ ;结束
SQR : ADD A,#01H ;地址调整 MOVC A,@A+PC ;查平方表 RET ;返回 SQRTAB: DB 0,1,4,9,16
DB 25,36,49,64,81 END
4.17 在HEX单元中存有两个十六进制数,试通过编程分别把它们转化成ASCII码存入ASC和ASC+1单元。
程序如下:
ORG 1200H
PUSH HEX ;入口参数压栈
ACALL HASC ;求十六进制数地位的ASCII码 POP ASC ;出口参数存入ASC MOV A,HEX ;十六进制数送A
SWAP A ;十六进制数高位送累加器A的低4位 PUSH ACC ;入口参数压栈
ACALL HASC ;求十六进制数高位的ASCII码 POP ASC+1 ;出口参数送ASC+1单元 SJMP $ ;结束
HASC:DEC SP DEC SP ;入口参数地址送SP POP ACC ;入口参数送A
ANL A,#0FH ;取出入口参数低4位 ADD A, #07H ;地址调整
MOVC A,@A+PC ;查表的相应ASCII码 PUSH ACC ;出口参数压栈 INC SP
INC SP ;SP指向断点地址高8位 RET ;返回主程序 ASCTAB: DB '0','1','2','3','4','5','6','7' DB '8','9','A','B','C','D','E','F' END
课后4.8 已知,从内部RAM BLOCK单元开始存放有一组带符号数,数的个数存放在LEN单元,请编写可以统计其中正数和负数个数并分别存入NUM和NUM+1单元的程序。
程序如下:
ORG 0200H LEN DATA 20H NUM DATA 21H BLOCK DATA 23H
MOV NUM ,#00H ;清零NUM单元 MOV NUM+1,#00H ;清零NUM+1单元 MOV R0,#BLOCK ;R0<--块起始地址 LOOP: MOV A,@R0 ;A<--源数
JNB ACC.7,POSI ;若正,则POSI INC NUM+1 ;负数个数加1 SJMP NEXT
POSI: INC NUM ;正数个数加1 NEXT: INC R0 ;原指针加1
DJNZ LEN,LOOP ;若未完,则LOOP SJMP $ END
4.9 设自变量X 为一无符号数,存放在内部RAM的VAX单元,函数Y存放在FUNC单元。请编写满足如下关系的程序:
X X≥50 Y= 5X 50>X≥20 2X X<20
程序如下:
ORG 0200H VAR DATA 20H FUNC DATA 21H
MOV A,VAR ;A<--(20H) CJNE A,#50H ,NEXT1 ;建立Cy
NEXT1: JNC DONE ;若X>=50,则DONE CJNE A,#20H,NEXT2 ;建立Cy
NEXT2: JC NEXT3 ;若X<20,则NEXT3 RL A ;若X>19,则A=5X RL A
ADD A,20H ;A<--5X SJMP DONE
NEXT3: RL A ;A<--2X
DONE: MOV FUNC ,A ;21H<--A SJMP $ END 实验程序: 1.存储块清零
Block equ 4000h
mov dptr, #Block ; 起始地址 mov r0, #0 ; 清 256 字节 clr a Loop:
movx @dptr, a
inc dptr ; 指向下一个地址 djnz r0, Loop ; 记数减一 ljmp $ end
1,二进制到ASCII码转换
将 A 拆为二个 ASCII 码, 并存入 Result 开始的二个单元 Result equ 20h org 0 ljmp Start ASCIITab:
db '0123456789ABCDEF' ; 定义数字对应的ASCII表 BinToHex:
mov dptr, #ASCIITab
mov b, a ; 暂存 A swap a
anl a, #0fh ; 取高四位 movc a, @a+dptr ; 查ASCII表 mov Result, a
mov a, b ; 恢复 A
anl a, #0fh ; 取低四位 movc a, @a+dptr ; 查ASCII表 mov Result+1, a ret Start:
mov sp, #40h mov a, #1ah call BinToHex ljmp $ End 2.程序跳转表
org 0 ljmp Start Func0: mov a, #0 ret
Func1: mov a, #1 ret
Func2: mov a, #2 ret
Func3: mov a, #3 ret FuncEnter:
add a, acc mov dptr, #FuncTab jmp @a+dptr FuncTab:
ajmp Func0 ajmp Func1 ajmp Func2 ajmp Func3 Start:
mov a, #0 call FuncEnter mov a, #1 call FuncEnter mov a, #2 call FuncEnter mov a, #3 call FuncEnter ljmp $ end
3.数据排序
Size equ 10 ; ajmp 为二字节指令, 调用号 X 2 ; 数据个数