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。

猜你喜欢

转载自blog.csdn.net/liming0931/article/details/81409511