350 likes | 528 Views
一、 内 RAM 数据传送指令. ⑴ 以累加器 A 为目的字节的传送指令(4条). ① MOV A,#data ; A ← data ② MOV A,direct ; A ←(direct) ③ MOV A,Rn ; A ← (Rn) ,n=0~7 ④ MOV A,@Ri ; A ← ((Ri)),i=0、1. 功能:将源操作数所指定的内容送入累加器 A 中。. 源操作数:立即寻址 直接寻址 寄存器寻址 寄存器间接寻址. 【例3-1】若( R0)=40H,(30H)=60H,(40H)=50H.
E N D
一、 内RAM数据传送指令 ⑴ 以累加器A为目的字节的传送指令(4条) ① MOV A,#data ; A←data ②MOV A,direct ; A ←(direct) ③ MOV A,Rn ; A ← (Rn) ,n=0~7 ④MOV A,@Ri ; A ← ((Ri)),i=0、1
功能:将源操作数所指定的内容送入累加器A中。功能:将源操作数所指定的内容送入累加器A中。 源操作数:立即寻址 直接寻址 寄存器寻址 寄存器间接寻址
【例3-1】若(R0)=40H,(30H)=60H,(40H)=50H ①MOV A,R0 ;将工作寄存器R0中的数据传送至A中 结果:(A)=40H ②MOV A,@R0 ;将以R0中内容为地址的存储单元中的数据送至A中 结果:(A) =50H
③MOV A,30H ;将直接地址30H存储单元中 的数据传送至A中, (A) =60H 结果:(A) =60H ④ MOV A,#30H ;将立即数#30H送入A中 (A)=30H 结果:(A)=30H
① MOV Rn,A ; Rn ←(A),n=0~7 ② MOV Rn,#data ; Rn ← data ,n=0~7 ③ MOV Rn,direct;Rn ←(direct),n=0~7 ⑵ 以工作寄存器Rn为目的字节的传送指令(3条)
功能:将源操作数所指定的内容送入当前工作寄存器组中的 某一个寄存器中。 源操作数:累加器A 立即寻址 直接寻址
例3-2:已知(A)=50H, (R1)=10H ,(R2)=20H , (R3)=30H , (30H)=4FH执行指令: MOV R1, A MOV R2 ,30H MOV R3,#85H 试求: (R1)=? (R2)= ?(R3)=? 执行指令后(R1)= 50H (R2)= 4FH (R3)=85H
⑶ 以直接地址为目的字节的传送指令(5条) ① MOV direct,A ; direct← (A) ② MOV direct,#data ; direct← data ③ MOV direct1,direct2; direct1 ←(direct2) ④ MOV direct,Rn ; direct← (Rn),n=0~7 ⑤MOV direct,@Ri ; direct← ((Ri)),i=0、1
例3-3:已知(R0)=60H , (R1)=72H ,执行指令: MOV 40H , @R0 试求指令执行结果。 执行指令后(40H)=72H
⑷ 以寄存器间址为目的字节的传送指令(3条) ① MOV @Ri,A ; (Ri)← (A),i=0、1 ② MOV @Ri,direct; (Ri)←(direct),i=0、1 ③ MOV @Ri,#data ; (Ri) ← data,i=0、1 功能:将源操作数所指定的内容送入以R0或R1为地址指针的片内RAM单元中。
例3-4:已知 (R1)=30H , (A)=20H , 执行指令: MOV @R1 , A 则 (R1)=? (30H)=? 执行指令后(30H)=20H
(5)以DPTR为目的操作数的数据传送指令 MOV DPTR ,#data16 功能:将外部RAM或ROM某单元地址作为立即数送到DPTR中,立即数的高8位送DPH,低8位送DPL。 注意:51唯一的16位传送指令。
例3-5:MOV DPTR,#1234H ;DPTR=1234H 该指令也可以用两条8位数据传送指令实现: MOV DPH,#12H ;DPH=12H MOV DPL,#34H ;DPL=34H,DPTR=1234H
上述五类传送指令中,需要注意几点: 1.传送指令无: MOV Rn , Rn MOV Rn , @ Ri MOV @Ri , Rn MOV @Ri , @Ri
2. 传送指令的字节数: 凡是指令中即不包含直接地址又不包含8位立即数的指令均为一字节指令; 若指令中包含一个直接地址或8位立即数,指令字节数为2; 若包含两个这样的操作数,则指令字节数为3。
MOV A , Ri ;1 个字节 MOV A ,direct ;2个字节 MOV direct , #data ;3个字节 MOV DPTR , #data16 ;3个字节
3.正确区分各种寻址方式的含义 若(R0)=60H ,(60H)=50H ,式探讨以下指令的执行结果: MOV A , R0 MOV A , @R0 MOV A , 60H MOV A , #60H (A)=60H (A)=50H (A)=50H (A)=60H
4.所有传送指令均不影响标志位:CY AC OV,但累加器A将影响标志位P
二、 访问外部RAM的数据传送指令 ① MOVX @DPTR ,A ; (DPTR) ←(A),i=0、1 • MOVX A,@DPTR ; A←((DPTR)) 功能:将DPTR的值作为外部RAM或I/0口的单元地址与累加器A之间传递数据。 范围:可寻址范围达外RAM64KB全部空间
③ MOVX @Ri,A ;(Ri)←(A),i=0、1 ④ MOVX A , @Ri ;A ←((Ri)) 功能:将R0或R1所指定的外部RAM单元与累加器A之间传递数据。 范围:因此这两条指令寻址范围仅限于外RAM 256个单元中。
例3-6:试编写程序,将片外RAM的1000H单元的内容送入片内0100H单元中。例3-6:试编写程序,将片外RAM的1000H单元的内容送入片内0100H单元中。 MOV DPTR ,#1000H MOVX A, @DPTR MOV DPTR,#0100H MOV @DPTR, A 注意:外RAM 之间不可以直接传递数据
三、程序存储器向累加器A传送数据 读ROM指令(2条) ① MOVC A,@A+DPTR ; A←((A)+(DPTR)) ② MOVC A,@A+PC ; A←((A)+(PC)) 注意:三个不同的存储空间用三种不同的指令传送: 内RAM(包括特殊功能寄存器): 用MOV指令传送; 外RAM: 用MOVX指令传送; ROM: 用MOVC指令传送。
【例3-7】 已知ROM中存有0~9的平方表0,1,4,9,…,首地址为2000H,试根据累加器A中的数值(0~9)查找对应的平方值,存入内RAM 30H。(设A=3) 方法一:若用DPTR作为基址寄存器,可编程如下: 1000H:MOV DPTR,#2000H ;置ROM平方表首地址 MOVC A,@A+DPTR ;(A)+(DPTR)=2003H(设A=3), ;A=(2003H)=09H MOV 30H,A ;平方值存入内RAM30H中 ………… 2000H: DB 0,1,4,9,16,25,36,…,81
即:2000H:00H ;平方表:02=0 2001H:01H ; 12=1 2002H:04H ; 22=4 2003H:09H ; 32=9 2004H:10H ; 42=16,16=10H ………… 2009H:51H ; 92=81,81=51H
方法二:用PC作为基址寄存器,在MOVC指令之前应先用一条加法指令进行地址调整,编程如下:方法二:用PC作为基址寄存器,在MOVC指令之前应先用一条加法指令进行地址调整,编程如下: MOV A,#00H ;待求平方的 值为0 ADD A,#data ;地址位置调整值 MOVC A , @A+PC 1FFDH:MOV 30H, A 1FFFH:RET 2000H: DB 0,1,4,9,16,25,36,…,81 Data 等于MOVC 与表格首地址之间指令所占的字节数。
【例3-8】 按下列要求传送数据:设ROM(2000H)=0ABH (1)ROM 2000H单元数据送内RAM 10H单元; (2)R0M 2000H单元数据送外RAM 80H单元; (3)ROM 2000H单元数据送外RAM 1000H单元; 解(1): MOV DPTR,#2000H ;置基址2000H,(DPTR)=2000H MOV A,#00H ;置变址0,(A)=00H MOVC A,@A+DPTR ;读ROM 2000H,(A)=ABH MOV 10H,A ;存内RAM 10H单元, (10H)=ABH
解(2): MOV DPTR,#1FFFH ;置基址1FFFH,(DPTR)=1FFFH MOV A,#01H ;置变址01H,(A)=01H MOVC A,@A+DPTR ;读ROM 2000H,(A)=ABH MOV R0,#80H ;置外RAN间址,(R0)=80H MOVX @R0,A ;写外RAM 80H,外RAM(80H)=ABH
解(3): MOV DPTR,#2000H ;置基址2000H, (DPTR)=2000H MOV A,#00H ;置变址0,(A)=00H MOVC A,@A+DPTR ;读ROM 2000H, (A)=ABH MOV DPTR,1O00H ;修改外RAN地址, (DPTR)=1000H MOVX @DPTR,A ;写外RAM 1000H,外RAM(1000H)=ABH
四、 堆栈操作指令(2条) 1.PUSH direct ; SP←(SP)+1,(SP)←(direct) 首先让sp的内容加1,使他指向栈顶空单元,然后将直接地址direct单元的内容送入栈顶空单元。 2. POP direct ; direct←((SP)),SP←(SP)-1 首先让sp所指的单元的内容送入直接地址direct单元,然后让sp的内容减1,成为新的栈顶单元。 注意:POP ACC 正确 POP A 错误
例PUSH 30H;(30H)=2BH,具体操作是: • 先将堆栈指针SP的内容(0FH)加1,指向堆栈顶的一个空单元,此时SP=10H; • ② 然后将指令指定的直接寻址单元30H中的数据(2BH)送到该空单元中。
例 POP 40H ;(40H)=4CH,具体操作是: ①先将SP所指单元0FH(栈顶地址)中的数据(4CH)弹出,送到指定的内RAM单元40H,(40H)=4CH② 然后(SP)-1→SP,SP=0EH,SP仍指向栈顶地址。
五、 交换指令(5条) 1. 字节交换指令 (1) XCH A,Rn ; (A)←→(Rn),n=0~7 (2) XCH A,@Ri ; (A)←→((Ri)),i=0、1 (3)XCH A,direct ; (A) ←→(direct) 功能:完成累加器A 与内部RAM 的整字节交换
例:(A)=16H (R1)=20H (20H) =10H XCH A , R1 ; (A)=20H ,(R1)=16H XCH A , @R1 ; (A)=10H , (RI)=20H ,(20H)=16H XCH A, 20H; (A)=10H, (20H)=16H
2. 半字节交换指令 XCHD A,@Ri ; (A)3~0←→((Ri))3~0 高4位不变。i=0、1 功能:将累加器A的低四位和Ri间址寻址单元的低四位进行交换,高四位保持不变。 例:(A)=16H (R1)=20H (20H) =30H XCHD A,@Ri (A)=10H ; (R1)=20H ; (20H) =36H
3.累加器高低四位互换 SWAP A ; (A)7~4←→(A)3~0 例:(A)=16H SWAP A; (A)=61H