汇编语言程序设计51单片机

汇编篇

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

完整的排序内容请见我下一篇博客
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值