8051 Instructions1.assembler에 의한 program개발 과정어셈블리 랭귀지란 기계어 즉, 1과0의 조합으로 이루어진 특정한기능(예:데이터 전송)을 수행 하도록 하는 디코딩 입력(processor내) 신호(디코딩된 신호와 clock 신호를 기준으로 순서적으로 기능 수행) 와, 명령 매개인자로서 이를 프로세서 사용자들로 하여금 쉽게 이해할 수 있도록 일정규약에 의해 문자로 바꾸어 기술한문자 언어이다. 그러므로 사용자는 이 랭귀지로 프로그래밍을 하게되고 어셈블러라고하는 PC 실행파일에 의하여기계어로 변환됨으로써, 원하는기능을 구현할수 있게 된다. 다음은 프로그래밍부터 타겟 보드에서 기능을 수행 할 때까지의 몇몇 과정(프로그램 개발과정)을 간략히 요약한 것이다.Text assembly language program source file 제작(하나의 file이거나 모듈별 여러file제작)=> assembler produce object code(어셈블러에 의해 각file의 상대번지실행코드를 만든다.)=> linker & locator-각 오브젝트코드를 링크하여 절대어드레스(완전히 정해진)를 부여한다.=> Object to hexadecimal conversion program produce hexa file(컴퓨터와 tool(ex: emulator)간 통신을 위한 포맷으로 변환)=>debug using an ice(in circuit emulator)-검증단계=> Rom programer-검증된 프로그램의 Rom programing.=> run a target board2.instruction의 형식MNEMONIC [제1 Operand] [제2 Operand] [제3 Operand]; mnemonic은 수행할 명령어이며 ,뒤의 Operand는 mnemoic에 따른 parameter로서 source나 destination(행선지)등이 오게된다. 실제로 assemble하게되면 assemble실행파일내의 interpreter에서 mnemonic을 bin 데이터나 직접적인 데이터를 목적지로 전송하는 기능을 갖는다.ex) 1MOV A,#47H2MOV R1,A3MOV A,3EH4MOV A,@R0이제 세부적인 명령어를 설명하기 전에 알아야할 특정 데이터를 지정하는 방법인 에드레싱모드의 의미에 관하여 간략히 설명할까한다.1 이미디에이트 데이터지정 ;위의 첫 번째 예에서처럼 목적지 A에 들어갈 데이터를 직접 지정하는 것이다. 이는 어셈블 되어질 때 레지스터 혹은 메모리에 저장될 데이터가 명령어에 직접 포함되는 것을 의미한다. 또한 제1 오퍼런드에는 지정 될 수 없다.2레지스터 어드레싱 모드 ;두 번째 예에서처럼 범용레지스터(R1-R7) 레이블로 어드레스를 지정한다. 예에서는 A에 있는 데이터를 R1으로 전송하게된다.3다이렉트 어드레싱 모드 ;세 번째 예에서처럼 데이터 메모리 어드레스를 바이트 단위로 직접 지정하는 것이다. 이는 직접 번지조작이 가능한 내부 데이터 어드레스만 가능하며, 내부데이터 메모리와 Acc혹은 범용레지스터에 전송이 가능하다. 예에서는3EH번지의 데이터를 A에 전송한다.4인다이렉트 어드레싱 모드 ;네 번째 예에서처럼 레지스터 R0내의 데이터가 가리키는 번지의 데이터를 A로 전송한다. 이는 번지를 가질 수 있는 범용레지스터 R0,R1,DPTR,A+DPTR에만 가능하다.각 어드레싱 모드에 관해서 알아보았다. 주의할 것은 내부데이터메모리 간 데이터 전송(각 번지지정모드간)은 모두 가능한, 레지스터뱅크의 범용 레지스터간 레지스터 어드레싱 모드 및 인다이렉트 어드레싱모드 사용은 불가능하다. 세부적인 사항은 각 인스트럭션설명시 첨가하도록하며 MOV 니모닉에 대하여 계속 설명한다. MOV 니모닉은 앞에서 설명한 것처럼 다음과 같은 형태로 사용하게 된다.*참고: 이하 Ri에서i는 0에서7중 한(특별 표기를 하지 않는 한)숫자이며 BYTEADDR은 바이트어드레스 (즉 다이렉트어드레싱모드) 이며,BITADDR은 BITADDRESS, 숫자 뒤의 H는 16진수를, B는 2진수를 의미하며 숫자만 있음은 10진수를 의미한다. BYTEADDR,#DATA ;DATA를 BYTEADDR번지에 전송한다. ex)MOV 34H,#56HMOV Ri,#DATA ;범용레지스터 Ri(R0-R7중하나)에 데이터 전송 ex)MOV R3,#11HMOV Ri,BYTEADDR ;범용레지스터 Ri(R0-R7중하나)에 BYTEADDR번지의 데이타를 전송(1오퍼런드 :레지스터 어드레싱모드,2오퍼런드:다이렉드 어드레싱모드)MOV BYTEADDR,Ri ;BYTEADDR번지에 Ri내의 데이터가 전송됨 ex)MOV 46H,R7(1오퍼런드:다이렉트어드레싱모드,2오펀런드:레지스터어드레싱모드,R7내에 데이터가 46H번지로 전송됨)MOV BYTEADDR,@R0 ;레지스터 R0내의 데이터가 가리키는 번지 내의 데이터가 BYTEADDR번지내로MOV BYTEADDR,@R1MOV @R0,BYTEADDR ;BYTEADDR내의 데이터가 R0내의 데이터가 가리키는 번지로 전송됨. ex)MOV DPTR,#WORDDATA ;DPTR에 WORDDATA를 전송. ex)MOV DPTR,#9876H(유일한 워드 데이터 전송 명령임)MOV C,BITADDR ;BITADDR내의데이터가 BIT C로 전송됨. ex)MOV C,20H.4 ,MOV C,P1.1MOV BITADDR,C*참고:제1오퍼런드로 ACCUMULATTOR가 오는 경우 MOV명령에서는 PSW의 PARITY BIT에만 영향을 미친다.*주의:MOV 인스트럭션 형식은 위의 형식 외에는 없으며, 앞서 설명했듯이 1,2 오퍼런드를 동시에 레지스터 어드레싱모드나,인다이렉트어드레싱모드로 사용할 수 없으며, 섞어 사용불가이다.ex)MOV R2,R3 (X);사용불가 MOV @R1,@R0 (X);사용불가MOV R2,@R0 (X);사용불가ii)외부데이터 메모리 전송 명령(MOVX:EXTERNAL RAM ACCESS):외부데이터메모리 ACCESS방법은 하위 네 가지 인스트럭션을 이용한 방법뿐이며, 이하 각 어드레싱모드 설명은 생략하기로 한다.형식; MOVX A,[@DPTR]MOVX A,[@Ri]MOVX [@DPT50HMOVX @DPTR,A ;외부메모리 어드레스 포인터 DPTR내의 데이터가 지시하는번지,즉 2550H 번지에 A의 데이터를 전송한다.MOV DPTR,#2550HMOVX A,@DPTR ;외부메모리 2550H번지의 데이터를 A로 전송한다.MOV R1,#0F06HMOV P2,#0MOVX @R1,A ;R0나 R1을 어드레스포인터로 사용할 경우 하위 어드레스만 정의되므로 상위 어드레스 포트인 P2에 필요한 어드레스를 정의해 주어야 한다.이 예에서는 F06H번지에 A의 데이터를 전송한다.*참고: 여기서도 마찬가지로 ACCUMLATOR가 제1오퍼런드로 올 때 PSW의 PARITY FLAG에 영향을 미친다.ii)프로그램 메모리 데이터 전송 명령(MOVC:MOVE CODE BYTE)형식: MOVC A, @A+DPTRMOVC A, @A+PC;MOVC명령은 프로그램메모리(보편적으로 ROM) 즉,프로그램이 수행되는 영역의 메모리 에서 데이터를 읽어 들인다. 이 명령은 PSW의 PARITY FLAG에 영향을준다.ex)MOVC A,@A+DPTR ;A와 DPTR의 값을 더한 번지(PROGRAM MEMORY AREA이어야함)에서 데이터를 A로 읽어온다.MOVC A,@A+PC ;A와 PC의 값을 더한 번지에서 데이터를 A로 읽어온다.iii)데이터 교환 명령(XCH:EXCHANGE OPERANDS,XCHD:EXCHANGE DIGITS)형식: XCH A,[SOURCE]여기서 SOURCE는 레지스터,인다이렉트, 다이렉트 어드레싱모드(Ri,@R0,@R1,BYTEADDR)만 위치 가능하다.SOURCE 와 A의 값을 교환한다.1오퍼런드가 ACCUMULATOR이므로 PSW에 영향(PARITY FLAG)을 준다XCHD A,[SOURCE]여기서 SOURCE는 @R0.@R1만 위치 가능하다. 각 A와 SOURCE의 하위 니블(하위4BITS)을 교환한다. 역시 PARITY FLAG에 영향을 준다.ex)XCH A,R5 ;A값과 R5값을 교환XCHD A,@R0 ;A값이 77H, @R0값이 55H라 할때 실행후다.PSW: CY(BIT7)| AC(BIT6)| F0(BIT5)| RS1(BIT4)| RS0(BIT3)| OV(BIT2)| RESERVED(BIT1)| P(BIT0)--------|---------|---------|----------|----------|----------|---------------|--------CARRY |보조CARRY| 범용 | 레지스터 뱅크 선택 | OVERFLOW | RESERVED | PARITYFLAG. |FLAG | FLAG. | FLAG. | FLAG. | | FLAG.*CY(CARRY FLAG);덧셈 및 뺄셈에서 최상위 배트에서 CARRY OR BORROW가 생기면 SET,ROTATE명령에서는 8번째 BIT로 사용,BOOL명령에서는 BIT ACCUMULATOR로 사용된다.*AC(AUXILIARY CARRY);3번째 BIT에 CARRY OR BORROW가 발생하면 SET된다.BCD연산에 사용된다.*RS1 | RS0----|----0 | 0 ;BANK0 선택됨(즉, 이때의 R0는 BANK0)0 | 1 ;BANK1 선택됨(이 때의 R0는 BANK1 즉,08H번지)1 | 0 ;BANK21 | 1 ;BANK3*OV(OVER FLAG);부호 있는 덧셈 뺄셈에서 결과 값이 -128--127을 넘으면 SET,곱셈에서 결과 값이 FFH를 넘으면 SET되고, 나눗셈 명령에서 제수가 0인 경우 SET됨. 그러나 덧셈 시 다른 부호 덧셈 시 OVERFLOW발생 안함*P(PARITY FLAG);ACC의 내용 중 1의 개수가 짝수이면 0,홀수면 SET된다.*F0;범용 플레그로 사용자가 어떤 용도로 사용하고자 할 때 사용된다.i)증가감소명령형식: INC/DEC [SOURCE];여기서 SOURCE는 다이렉트 어드레싱 모드, 레지스터, 인다이렉트 어드레싱 모드(Ri,@R1,@R0,DIRECT ACC)가 위치 가능하며,INC의 경우 DPTR도 가능하다.SOURCE가 A일 경우 PARITY FLAG에 영향을 준다(A의 BINARY 1의 갯수가 홀수일 경우