汇编入门(一)
1.第一个汇编程序
目前利用的是keil软件,建立文件时扩展名一定要为asm
如何查看具体地址存储器中的值:
在工具栏上选择“VIEW”>“memory windows”>“memory1”
然后输入地址即可:
注意这里第一行第一列为0x1B,则右边下一个是0x1C
第一个汇编程序:
ORG 0000H ;伪指令,定义下面的指令所在地址,此句为主程序的开始地址
LJMP MAIN ;无条件转移到MAIN
MAIN: ;主程序
MOV 30H,#40H ;30H的内容为40H
MOV 40H,#10H ;40H的内容为10H
MOV R0,#30H ;R0的内容为30H
MOV A,@R0 ;A的内容为40H
MOV R1,A
MOV B,@R1
SJMP $ ;转到该指令的开头开始执行
END ;程序结束
汇编程序练习:
1.A中的压缩BCD码分为二个字节,形成非压缩BCD码,放入40H和41H单元中
MOV R0,A
ANL A,#00001111B ;ANL:与运算
MOV 40H,A
MOV A,R0 ;取回原数据
ANL A,#11110000B
SWAP A ;将A中高四位与低四位交换
MOV 41H,A
2.有两个4位BCD码,分别存放在内部数据存储器的50H~51H单元和60H~61H单元中
;试编写求这两数之和的程序,结果存放到 40H~41H 单元中
MOV A,50H ;A←(50H)
ADD A,60H ;低两位相加,A←(A)+(60H)
DA A ;进行 BCD 码修正 ,DA A 指令为十进制调整指令
MOV 40H,A ;将修正后的低两位结果送 40H
MOV A,51H ;A←(51H)
ADDC A,61H ;高两位带上低位的进位位相加,A←(A)+(61H)+CY
DA A ;进行 BCD 码修正
MOV 41H,A ;将修正后的高两位结果送 41H
3.;内部数据 RAM 中 20H~3FH 单元的内容传送到,外部数据存储以 2000H 开始的连续单元中去。
20H~3FH 共计32个单元,需传送32次数据。R1作为循环计数器。
MOV R0,#20H ;设置R0为内部RAM首地址
MOV DPTR,#2000H ;设置外部RAM首地址
MOV R1,#32 ;设R1为计数器
LOOP:
MOV A,@R0 ;取内部RAM数
MOVX @DPTR,A ;送外部 RAM
INC R0 ;调整内部RAM指针,指向下一个数据
INC DPTR ;调整外部RAM指针
DJNZ R1,LOOP ;未完继续
SJMP $ ; 停机
4.将片外RAM空间2000H~200AH中的数据的高4位变零,低4位不变,原址存放
MOV DPTR,#2000H ;数据指针DPTR存开始地址
MOV R1,#0BH ;B=11,一共是0到A:12个数据
LOOP: MOVX A,@ DPTR ;循环指令
ANL A,#0FH ;与运算,高四位清0,低四位不变
MOVX @ DPTR,A ;题目要求原址存放
INC DPTR ;DPTR加一
DJNZ R1,LOOP ;R1减一,若此时R1不为0,则跳转至LOOP
SJMP $
5.内部数据RAM中40H~49H中的10个无符号数逐一比较,从小到大的顺序依次排列在这片单元中。
START: CLR F0 ;清除交换标志位F0
MOV R3,#9 ;十个数据循环次数
MOV R0,#40H ; R0存放区首址
MOV A,@R0 ; 取前数
L2: INC R0 ;R0加1
MOV R2,A ;保存前数
SUBB A,@R0 ;前数减后数,如果是小数减大数,进位C会被置1
MOV A,R2 ;恢复前数
JC L1 ;顺序则继续比较.如果进位为1则转到L1
SETB F0 ;逆序则建立标志位
XCH A,@R0 ;前数与后数交换
DEC R0 ;R0减1,指向前数单元
XCH A,@R0
INC R0 ;仍指向后数单元
L1: MOV A,@R0 ;取下一个数
DJNZ R3,L2 ;依次重复比较,R3减1,不为0 则转移到L2
JB F0,START ;交换后重新比较,如果F0为1 则转移到START
RET ;从子程序返回
END