zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    工厂增强
    面试题
    SpringBean生命周期及作用域
    字符串
    带参数方法实例
    带参数方法
    人机猜拳
    类的无参方法
    类和对象实例2
    类和对象实例1
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007474.html
Copyright © 2011-2022 走看看