51单片机汇编程序实例一

;已知程序执行前有A=02H,SP=52H,(51H)=FFH,(52H)=aaH.

	ORG 0000H
	MOV A, #02H
	MOV 51H, #0xFF
	MOV 52H, #0xaa
	MOV SP, #52H
	POP DPH 			;SP=51H
	POP DPL 			;SP=50H
	mov dpl, #0xfe
	mov dph, #0x21
	inc dptr
	inc dptr
	;POP SP            ;sp 会置为 0
	MOV DPTR, #4000H 	;DPTR=#4000H
	RL A 				;A=04H(02H*2)
	MOV B,A 			;B=04H 
	MOVC A,@A+DPTR 		;查表A=30H                     ;//这里怎么得出A=30H?
	PUSH ACC 			;SP=51H,(51H)=#30H这里为什么SP=51H?然后(51H)=#30H又是怎么得出的?    
	MOV A,B 			;A=04H
	INC A 				;A=05H
	MOVC A,@A+DPTR 		;查表A=50H
	PUSH ACC 			;SP=52H,(52H)=#50H
	RET 

	ORG 4000H 
	DB 10H,80H,30H,50H,30H,50H
	end

;这就是个查表并把查得数据进行压栈的程序。

ORG 4000H是定义的伪指令,定义了存放表中数据的首地址在4000H,由于数据类型是DB即只占用了一个字节,所以储存单元及其内容是4000H存放数据10H,4001H存放80H……4004H存放30H,4005H存放50H。该伪指令使得编译时地址分配按照以上实现。起初两次弹栈后SP=50H,50H是指堆栈地址。

第一次MOVC  A,@A+DPTR,MOVC是个查表指令,它实现把A+DPTR地址所指的数据查找到并赋给累加器A,由于A=04H,此时A+DPTR=4004H,对应数据30H。

PUSH  ACC则把累加器A中的数据进行压栈,由于SP=50H,故30H被存在压栈寄存器50H所指地址上,即(50H)=30H。该指令执行完后,SP会自动+1,改为指向地址51H。

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值