当前位置:首页 > 微机原理课后习题及答案
BCDCH:
PUSH ACC ;保护现场
PUSH PSW
MOV PSW, #10H ;设定当前工作寄存器区为2区 MOV R0, #40H ;R0指向源数据块首地址 MOV R1, #50H ;R1指向目标数据块首地址 MOV R7, #5
;转换5次
;前一单元内的BCD码送入ACC的高四位
LOOP: MOV A, @R0
SWAP A INC ORL
R0
;R0指向下个源数据
;后一单元内的BCD码送入ACC的低四
A, @R0
位,同时并未改变源数据
MOV @R1, A INC
R1
;压缩BCD码送入目标地址 ; R1指向下个目标单元
DJNZ R7, LOOP POP POP RET
PSW ACC ;返回 ;恢复现场
37
4-17 编制一子程序,完成15个单字节补码数据按绝对值大小从小到大进行排队。设数据放在30H为首地址的内部数据存储器中。 提示:排序的基础是比较!无论是对原码、补码还是绝对值排序,基本算法都可沿用无符号数冒泡法的算法,只是在读取数据时需对数据进行一些处理,或在比较两个数的大小时改变一下方法(比如符号位的判断)。补码按绝对值排序的算法我想到了两种(当然不排除有其它方法)。一种是将补码转换成原码,由于原码是在最高位表示符号,而其余各位表示数值部分(即绝对值),这样只需比较原码的低7位即可;或者直接将其中负数的补码转换成其相反数的补码(这样所有比较的数据均为正数的补码,形式上也就是其绝对值,转换的方法是连同符号位一起取反后加1,这种方法也适用于对-128的补码进行转换)。另一种方法,判断两个待比较数的符号,同号时相减,如果差数与减数异号,则被减数绝对值<减数绝对值;两数异号时相加,如果和与被加数异号(或与加数同号),则被加数绝对值<加数绝对值;无论加减,结果为0,则两数绝对值必定相同。 ;绝对值排序,算法一
;入口参数:子程序名PAIXU,影响ACC,寄存器B,2区寄存器R0, R2, R3, 标志位Cy,F0
;出口参数:排序后数据仍放在30H开始的15个内部数据存储器单元中
38
PAIXU: NEXT: LOOP: CJNE LOP1: FPOS: CJNE LOP2: PUSH ACC ;保护现场 PUSH PSW MOV PSW, #10H ;设定2区寄存器区,同时0→F0 MOV R3, #14 ;暂存比较次数→R3 CLR F0 ;进入循环前,清除交换标志F0 MOV R0, #30H ;首地址→R0 MOV R2, 13H ;当前比较次数(R3)→R2 MOV A,@R0 ;取出前一个数 A, #80H, LOP1 ;判断正负 JC FPOS ;如果为正数,则不转换 CPL A ;如果是负数,取相反数补码 INC A ;即得负数的绝对值 MOV B, A ;前数的绝对值→B INC R0 ;R0指向下个数 MOV A, @R0 A, #80H, LOP2 JC COMP ; 如果是负数,取相反数补码 CPL A INC A ; 后数的绝对值→ACC COMP: CJNE A, B, NEQ ;比较前后两绝对值 SJMP NEXCH ;后=前,不交换 NEQ: JNC NEXCH ;后>前,不交换 SETB F0 ;后<前,交换位置,置标志F0 MOV A, @R0 ;后数→ACC DEC R0 ;R0指向前单元 XCH A, @R0 ;后数→前单元,前数→ACC INC R0 ;R0恢复指向后单元 MOV @R0, A ;前数→后单元 NEXCH: DJNZ R2, LOOP ;判断一次冒泡是否完成 DEC R3 ;修改每次冒泡中的比较次数 JBC F0, NEXT ;判断冒泡中有无交换,清除F0 POP PSW ;若上次冒泡中无交换,则排序完成 POP ACC RET
对上述程序稍作改动,程序的效率就高了(每次比较时执行的指令少了,速度就快了)
39
PAIXU: NEXT: PUSH PUSH MOV MOV CLR MOV MOV MOV CJNE LOP1: JC CPL INC FPOS: MOV LOOP: INC MOV CJNE LOP2: JC CPL INC COMP: CJNE NEQ: JC XCH SJMP EXCH: SETB MOV DEC XCH INC MOV NEXCH: DJNZ DEC JBC POP POP RET ACC PSW PSW, #10H R3, #14 F0 ;进入循环前,清除交换标志F0 R0, #30H R2, 13H A,@R0 A, #80H, LOP1 FPOS A A B, A R0 A, @R0 A, #80H, LOP2 COMP A A A, B, NEQ EXCH A, B ;若不交换,则后>前,将后一绝对值(较大)送入B,作为下次比较的前一个绝对NEXCH F0 ;置位交换标志 A, @R0 ;借助ACC交换前后两个数 R0 A, @R0 R0 @R0, A R2, LOOP R3 ;每冒泡一次,比较次数-1 F0, NEXT PSW ACC
;绝对值排序,算法二
;入口参数:子程序名PAIXU2,影响ACC,寄存器B,2区寄存器R0, R2,
40
共分享92篇相关文档