- 打卡等级:偶尔看看III
- 打卡总天数:42
- 最近打卡:2024-07-15 12:37:13
中级会员
- 积分
- 344
|
发表于 2023-8-9 19:17:13
|
显示全部楼层
本帖最后由 cuisheng 于 2023-8-11 22:51 编辑
第8集视频学习
一、数据传送类指令
对程序状态字PSW一般不产生影响
分为三种:
数据传送
数据交换
栈操作
1、传送指令:MOV
主要是内部数据存储器和特殊功能寄存器
MOV <目的字节>, <源字节>
MOV A, #data8 ; (A) <- #data8
MOV addr8, #data8 ; (addr8) <- #data8
MOV @Ri, #data8 ; ((Ri)) <- #data8
MOV Rn, #data8 ; (Rn) <- #data8
@符号表示间接寻址,Ri中 i=0或 i=1
汇编语言测试模板:
- $NOMOD51
- $include (stc8h.h)
- ORG 0000H
- LJMP MAIN ;跳转到主程序
- ORG 0100H
- MAIN
- MOV SP, #70H
-
- LOOP:
- LJMP LOOP
- END
复制代码
观察内部RAM的内容,Address:D:0
查看IO口的内容:Menu: Peripherals -> I/O-Ports -> Port X
* Rn、内部RAM、SFR与累加器A传送数据。共6条:
MOV A, addr8 ;(A) <- (addr8)
MOV A, @Ri ;(A) <- ( (Ri) )
MOV A, Rn ;(A) <- (Rn)
MOV addr8, A ;(addr8) <- (A)
MOV @Ri, A ;( (Ri) ) <- (A)
MOV Rn, A ;(Rn) <- (A)
手工修改Memory内容,鼠标右键,单击Modify Memory at D:0xXX
MOV R1, #82H
MOV A, @R1
内部80H~FFH的RAM单元,只能使用如上方式的间接寻址方式
* Rn、SFR和内部RAM之间的数据传送,共5条:
MOV addr8, addr8 ;(addr8目) <- (addr8源)
MOV addr8, @Ri ;(addr8) <- ( (Ri) )
MOV addr8, Rn ;(addr8) <- (Rn)
MOV @Ri, addr8 ;( (Ri) ) <- (addr8)
MOV Rn, addr8 ;(Rn) <- (addr8)
* 目标地址传送
MOV DPTR, #data16
* 外部数据存储器(或扩展并行I/O口)与累加器A传送 MOVX
只能使用寄存器间接寻址,有两种方式:
1、用R1或R0进行寄存器间接寻址
需要使用P2口输出高8位地址,先给P2和Ri赋值,然后执行MOVX
MOVX A, @Ri ;(A) <- ( (P2 Ri) )
MOVX @Ri, A ;( (P2 Ri) ) <- (A)
2、用16位的数据存储器地址指针DPTR进行寄存器间接寻址
能遍历64KB的外部存储器的任何单元
MOVX A, @DPTR
MOVX @DPTR, A
Keil仿真,查看外部存储单元数据:X:0100H
* 程序存储器向累加器A传送指令 MOVC
MOVC A, @A + PC ;PC <- (PC) + 1, (A) <- ( (A) + (PC) )
MOVC A, @A + DPTR ;(A) <- ( (A) + (DPTR) )
(变址寻址,PC或DPTR作为基址寄存器)
注:保护DPTR的内容:
PUSH DPH
PUSH DPL ;保护DPTR
......
POP DPL
POP DPH ;恢复DPTR
调用子程序: LCALL 子程序名
* 数据交换指令
1、字节交换指令
XCH A, addr8 ;(A) <--> (addr8)
XCH A, @Ri ;(A) <--> ( (Ri) )
XCH A, Rn ;(A) <--> (Rn)
2、半字节交换指令(低半字节交换)
XCHD A, @Ri ;(A低三位字节) <--> ( (Ri)低三位字节 )
* 栈操作指令
概念:断点地址、压栈(保护现场)、出栈(恢复现场)
PUSH addr8 ;(SP) <- (SP) + 1, ( (SP) ) <- (addr8)
POP addr8 ;(addr8) <- ( (SP) ), (SP) <- (SP) - 1
数据传送类指令注意事项:
1、向累加器传送数据时,会影响PSW中的P标志
2、执行传送指令时,源地址中的内容不变
3、特殊功能寄存器SFR只能使用直接寻址
4、80H~FFH单元只能使用@Ri间接寻址方式
5、累加器A压栈和出栈时,应使用 PUSH ACC 或者 POP ACC。(* 使用A表示寄存器寻址,使用ACC表示直接寻址)
|
|