汇编篇
ORG 汇编起始地址命令
END 汇编结束命令
EQU 等值命令
DATA 数据地址赋值命令
DB DW DS
CLR 清零
题目如下
1.设计一个求解16位原码数据的补码的程序,要求:原码数据放在R1R0中,补码数据存放在R7R6中;
- 16位有符号数求补码,首先要判断这个数的符号,如果是正数,那么它的补码就是它本身,如果是负数,那么就得求反、再加一。 -
十进制: R1=8FH,R0=3FH;
二进制: 1000 1111,0011 1111
ORG 0000H
MOV A,#8FH
MOV R1,A
MOV A,#3FH
MOV R0,A ;上面这几段代码是给寄存器R1R0赋初值,大小可以自己定。
MOV A,R1
JNB ACC.7,NEXT ;判断R1的最高字节是否为0,如果为0,则跳转到NEXT后;否则,则顺序执行程序。
XRL A,#7FH ;异或运算,将寄存器A的值取反
MOV R7,A
MOV A,R0
CPL A
ADD A,#1 ;如果有进位,则进位标志C变为1
MOV R6,A
MOV A,#0 ;这里也可以用CLR A,将累加器A清零,
ADDC A,R7 ;寄存器R1+C(进位标志);ADDC是将寄存器和累加器和进位相加
MOV R7,A
SJMP $
NEXT: ;如果R6的最高位是0,则直接将R6赋给R1,R7赋给R0
MOV A,R0
MOV R6,A
MOV A,R1
MOV R7,A
SJMP $
END
2.设计一个求解两个16位原码数据的减法运算程序,要求:计算(31H)(30H)——(41H)(42H),最终结果以原码形式存放在51H和50H
ORG 0000H
CRL C
MOV A,30H
MOV R0,42H
SUBB A,R0
MOV 50H,A ;将低位数据放入51H中
MOV A,31H
MOV R0,41H
SUBB A,R0
MOV 51H,A ;将高位数据放入51H中 END
3.设计一个区域内数据查找程序,要求:查找在内部RAM的30H~50H单元中是否有0AA这一数据。若有,则将51H单元置为“01H”;若未找到,则将51H单元设置为“00H”
ORG 0000H
MOV R0,#30H
LOOP2:CJNE @R0,#0AAH,LOOP1
MOV 51H, #01H
LOOP1: INC R0
CJNE R0,#50H ,LOOP2
MOV 51H, #00H
END
4.设计一个区域最大数查找程序,要求:在内容RAM的21H单元开始存有一组单字节无符号数,数据长度为20H,要求找出其中的最大数存入52H
MOV R0,#21H
MOV 52H,#00H
MOV R2,#20H ;数据长度.
LOOP:
MOV A,@R0
CLR C
SUBB A,52H ;相减
JNC rel1 ;有进位标志符 跳转.
MOV A,@R0 ;.无进位标志符 则将这个值当做最大的
MOV 52H,A
rel1:
INC R0 ;转向下一个.
DJNZ R2,LOOP .
SJMP $
END
5.用选择法编写排序,对片内RAM的40H到49H单元中的无符号数从小到大排序
XCH A Ri 交换
方法一(自创 仅供参考):
ORG 0000H
LJMP MAIN
MAIN:
CLR 00H;
MOV R1,40H ; I
LOOP2:
MOV A,#1
ADD A,R1
LOOP1:
MOV R0,A; J=I+1
MOV A,@R1
MOV R3,@R0
MOV 00H,R3
CJNE A ,00H
JC NEXT1 ;A<R3则 cy=1
MOV A,R0; 交换
XCH A,R1
MOV R1, A
INC R0
CJNE R0,49H LOOP1
INC R1
CJNE R0,49H LOOP2
END
方法二(书本借鉴):
代码原型 冒泡排序 如下
//F0 为交换标志位
//DEC 为减一
//SETB 置1
//DJNZ 减一不为1转移
SORT:
MOV A,R0
MOV R1 ,A
MOV A,R2;这里是用R2备份数据个数
MOV R5,A
CLR F0
DEC R5 ;R5为排序个数
MOV A,@R1 ;R1为第一个数的地址
LOOP:
MOV R3, A
INC R1
CLR C
MOV A,@R1
SUBB A,R3
JNC LOOP1
SETB F0
MOV A,R3
XCH A,@R1
DEC R1
XCH A,@R1
INC R1
LOOP1:
MOV A,@R1
DJNZ R5,LOOP
JB F0,SORT ;判断是否有数据交换
RET
//选择排序的关键在于找出最值
寻找最值程序
如R1为首地址,20个数的max
MOV R3, #20
MOV A,R1
MOV R0,A
DEC R3
MOV A,@R0
LOOP:
MOV R2,A
INC R0
CLR C
SUBB A,@R0
JNC LOOP1
MOV A,@R0
SJMP LOOP2
LOOP1:
MOV A,R2
LOOP2:
DJNZ R3, LOOP
MOV @R1,A
RET
选择排序代码如下
MOV R3, #10
MOV R1, 40H
MOV R4,#10
LOOP3:
MOV A,R1 ;40H为首地址
MOV R0,A
DEC R3
MOV A,R0
MOV R7 ,A ;用R7记录R0地址
MOV A,@R0
LOOP:
MOV 00H, R7
MOV R6 ,00H;用R6记录R0即R2数值的地址
MOV R2,A
INC R0
CLR C
SUBB A,@R0
JNC LOOP1
MOV A,@R0 ;此时最大值的地址为R0
SJMP LOOP2
LOOP1: ; R2的值大
MOV A,R6
MOV R0,A ;将R2的地址R6赋值给R0
LOOP2: ;R0大
DJNZ R3, LOOP
MOV A,R1 ;两个数交换
XCH A,R0
MOV @R1,A ;将最大的数存入R1
DEC R4
INC R1
DJNZ R4,LOOP3
RET
完整的排序内容请见我下一篇博客