'Assembly'에 해당되는 글 2건

  1. 2008.11.21 [Assembly] 특정 메모리에 값을 쓰거나 읽기
  2. 2008.11.17 80x86 asm 명령어
Programming/Assembly2008. 11. 21. 10:15


void Mm(int *, char);     // 첫번째 인자의 메모리주소에 두번째 char형을 write
char Md(int *);            // 첫번째 인자의 메모리주소에 있는 char형 값을 리턴



#include <stdio.h>

void Mm(int *, char);      // Memory Modify func
char Md(int *);            // Memory Display func


int main()
{
  char cTemp1;
  char cTemp2;

  Mm( (int *)0x0012FF00 , 'A' );       // 0x0012FF00  번지에 'A' set
  Mm( (int *)0x0012FF04 , 'B' );      // 0x0012FF04  번지에 'B' set

  cTemp1 = Md( (int *)0x0012FF00 );  // 0x0012FF00  번지에 있는 값 가져오기
  cTemp2 = Md( (int *)0x0012FF04 );  // 0x0012FF00  번지에 있는 값 가져오기

  return 0;
}



PUBLIC    _Mm  ; // Mm함수를 외부에서 사용할수있게 set
PUBLIC    _Md  ; // 어셈블리는 함수이름앞에 _를 붙인다


.386
.MODEL    FLAT
.CODE


// Mm 정의   Memory Modify
_Mm  PROC  NEAR32
    push  ebp
    mov  ebp, esp



    mov  eax, esp       ; // 스텍포인터의 이동을 위해 잠시 eax에 넣어둔다

    mov  esp, [ebp+8]   ; // 스텍포인터에 첫 번째 인자값 대입
    add  esp, 4         ; // 스텍포인터를 0x0012FF04로 옮긴후 
    push  [ebp+12]      ; // 두 번째 인자를 push 

    mov  esp, eax       ; // eax에 들어있던 원래 ESP의 값을 돌려놓는다
    


    mov  esp, ebp
    pop  ebp
    ret
_Mm  ENDP




// Md 정의   Memory Display
_Md  PROC  NEAR32
    push  ebp
    mov  ebp, esp

    push  ebx            ; // ebx를 잠시쓰기위해 push
    mov  ebx, esp        ; // ESP를 ebx에 잠시 넣어놓는다 

    mov  esp, [ebp+8]    ; // 첫 번째 인자의 주소를 ESP에 대입
    mov  eax, [esp]      ; // 현재 스텍포인터가 가리키는곳을 eax에 넣는다(자동리턴)

    mov  esp, ebx        ; // 스텍포인터를 원래대로 돌려 놓는다
    pop  ebx             ; // 저장해놓았던 ebx값을 되돌려 놓는다

    

    mov  esp, ebp
    pop  ebp
    ret
_Md  ENDP


END




Posted by 시긔양

댓글을 달아 주세요

Programming/Assembly2008. 11. 17. 09:19

80x86 명령어

 AAA  -  ASCII Adjust after Addition

기능 : ASCII 코드로 된 두 디지트를 ADD 명령어가 더한후에 이용한다


AAD  -  ASCII Adjust before Division

기능 : AL과 AH에 있는 2개의 언팩 BCD 디지트를 이진수로 변환하기 위해

      DIV 명령어 앞에서 사용한다


AAM  -  ASCII Adjust after Multiplication

기능 : MUL명령어가 2개의 언팩 BCD를 곱하고 난 후 사용한다.


AAS  -  ASCII Adjust after Subtraction

기능 : 두 디지트를 빼고 난후, AL에 있는 결과를 팩 BCD로 변환하기 위해 사용한다.


ADC  -  Add with Carry

기능 : 이 명령어 앞에서 CF=1인 경우 이 명령어를 실행하면 원천 오퍼랜드에 목적지

       오퍼랜드가 더해지고 그리고 1이 더해진다


ADD  -  Signed or Unsigned ADD

기능 : 원천 오퍼랜드를 목적지 오퍼랜드에 더하고 그 결과를 목적지 오퍼랜드에 저장한다


AND  -  Logical AND

기능 : 두 오퍼랜드에 대해 논리 AND를 수행하여 그 결과를 목적지 오퍼랜드에 저장한다


CALL  -  Call a Procedure

기능 : 제어를 프로시져로 넘긴다. RET를 사용하여 제어를 CALL 다음의 명령어로 되돌린다


CBW  -  Convert Byte to Word

기능 : D7을 AH의 모든 비트로 복사한다


CLC  -  Clear Carry Flag

기능 : CF를 0으로 리셋시킨다. (CF=0)


CLD  -  Clear Direction Flag

기능 : DF를 0으로 리셋시킨다. (DF=0)


CLI  -  Clear Interrupt Flag

기능 : IF를 0으로 리셋시킨다. (IF=0)


CMC  -  Complement Carry Flag

기능 : CF를 0에서 1로 또는 1에서 0으로 바꾼다.


CMP  -  Compare Operands

기능 : 길이가 같은 두 오퍼랜드를 비교한다. 원천 및 목적지 오퍼랜드는 변경되지 않는다.

CMPS/CMPSB/CMPSW  -  Compare Byte or Word String

기능 : 스트링을 한번에 한 바이트 또는 한 워드씩 비교한다.


CWD  -  Convert Word to Doubleword

기능 : AX의 부호 비트를 DX의 모든 비트에 복사하여 AX에 있는 부호없는 워드를 더블워드로

      변환한다.


DAA  -  Decimal Adjust after Addition

기능 : BCD 숫자를 더한 다음에 결과를 다시 BCD로 변환하기 위해 사용한다.


DAS  -  Decimal Adjust after Subtraction

기능 : BCD 숫자를 뺄셈한 다음에 결과를 다시 BCD로 변환하기 위해 사용한다.


DEC  -  Decrement

기능 : 목적지 오퍼랜드에서 1을 뺀다.


DIV  -  Unsigned Division

기능 : 부호없는 워드(AX)를 바이트로 나누거나 부호없는 더블워드(DX:AX)를 워드로 나눈다


ESC  -  Escape

기능 : 마이크로프로세서와 데이터 버스 및 어드레스 버스를 공유하는 수학 보조프로세서

       (8087과 같은)를 사용할수 있게 해준다.


HLT  -  Halt

기능 : 마이크로프로세서로 하여금 명령어의 실행을 정지시킨다.


IDIV  -  Signed Number Division

기능 : 부호있는 워드(AX)를 바이트로 나누거나 부호있는 더블워드(DX:AX)를 워드로 나눈다


IMUL  -  Signed Number Multiplication

기능 : 부호있는 바이트 또는 워드 원천 오퍼랜드를 AL 또는 AX에 있는 부호있는 바이트

      또는 워드에 곱하여 그 결과를 AX 또는 DX:AX에 저장한다


IN  -  Input Data form Port

기능 : 두 번째 오퍼랜드에서 지정한 입력 포트로부터 바이트 또는 워드를 AL 또는

       AX로 전송한다


INC  -  Increment

기능 : 오퍼랜드에 의해 지정된 레지스터 또는 메모리 위치에 1을 더한다.


INT -  Intettupt

기능 : 실행을 256가지의 인터럽트중의 하나로 넘긴다.


INTO  -  Interrupt on Overflow

기능 : OF가 1로 세트되면 오버플로우를 위해 작성해놓은 인터럽트 처리기로 실행을 넘긴다

IRET  -  Interrupt Return

기능 : ISR의 끝에서 사용되며, 실행이 INT 명령어 다음의 명령어에서 계속되도록 하기

      위해 모든 플래그, CS 및 IP를 인터럽트 수행 이전에 가졌던 값으로 복원 시킨다


JUMP  -  명령어

기능 : 어떤 조건이 만족되면 행선지 번지로 점프하도록 하는데 사용한다.


JMP  -  Unconditional Jump

기능 : 새로운 번지로 제어를 무조건 넘기는데 사용한다. JMP와 CALL의 차이는, CALL 명령어는

       CALL 다음의 명령어로 되돌아와 실행을 계속하는 반면 JMP는 되돌아오지 않는다


LAHF  -  Load AH from Flags

기능 : 플래그 레지스터의 하위 8비트를 AH에 로드한다


LDS  -  Load Data Segment Register

기능 : 원천이 가르키는 2개의 메모리 위치의 내용을 목적지(레지스터이다)에 로드하고

       그 다음의 2개의 연속적인 메모리 위치의 내용을 DS에 로드한다.


LEA  -  Load Effective Address

기능 : 직접 메모리 오퍼랜드의 유효 번지를 목적지에 로드한다.


LES  -  Load Extra Segment Register

기능 : 원천이 가르키는 2개의 메모리 위치의 내용을 목적지(레지스터이다)에 로드하고

       그 다음의 2개의 연속적인 메모리 위치의 내용을 ES에 로드한다.


LOCK  -  Lock System Bus Prefix

기능 : 2개 이상의 프로세서가 있는 마이크로컴퓨터에서 한 프로세서가 명령어를 실행하고 있는

      동안 다른 프로세서가 시스템 버스의 제어권을 빼앗지 못하도록 하기 위해 사용된다


LODS/LODSB/LODSW   Load Byte or Word String

기능 : DS:SI가 가리키는 메모리 위치로부터의 바이트 또는 워드를 AL 또는 AX에 로드 한다.


LOOP  -  Loop until CX =0

기능 : CX를 1 감소시킨 다음 CX가 아니면 오퍼랜드가 가리키는 곳으로 점프하며,

       0일 경우에는 LOOP아래에 있는 다음 명령어를 실행 시킨다.


LOOPE / LOOPZ  -  Loop if Equal / Loop if Zero

기능 : CX를 1 감소시킨 다음 CX가 0이 아니면서 ZF = 1이면 오퍼랜드가 가리키는

        곳으로 점프하고 그렇지 않으면 다음의 명령어에서 실행을 계속한다.


LOOPNE / LOOPNZ  -  Loop While CF Not Zero and ZF Equal Zero

기능 : CX를 1 감소시킨 다음 CX와 ZF가 0이 아니면 오퍼랜드가 가리키는 위치로 점프하고

       그렇지 않으면 이 명령어 다음에서 실행을 계속한다.

MOV  -  Move

기능 : 레지스터, 메모리 위치, 즉석 상수인 워드 또는 바이트를 레지스터 또는 메모리

        위치에 복사한다.


MOVS / MOVSB / MOVSW  Move Byte or Word String

기능 : DS : SI가 가리키는 메모리의 위치로부터 바이트 또는 워드를 ES : DI가

        가리키는 메모리 위치로 복사한다.


MUL  -  Unsigned Multiplication

기능 : 오퍼랜드가 가리키는 부호 없는 바이트 또는 워드를 AL 또는 AX에 들어있는 바이트

        또는 워드에 곱한 결과를 AX 또는 DX : AX 에 저장한다.


NEG  -  Negate

기능 : 오퍼랜드에 대해 2의 보수를 취한다.


NOP  -  No Operation

기능 : 아무 일도 수행하지 않는다.


NOT  -  Logical NOT

기능 : 오퍼랜드에 대해 1의 보수를 취한다.


OR  -  Logical OR

기능 : 두 오퍼랜드에 대해 비트끼리 논리 OR 연산을 수행하고 그 결과를 목적지

        오퍼랜드에 저장한다.


OUT  -  Output Byte or Word

기능 : 이 명령어는 AL 또는 AX 에 있는 바이트 또는 워드를 첫 번째 오퍼랜드에서 

         지정한 출력 포트로 내 보낸다.


POP  -  POP Word

기능 : 스택포인터가 가리키는 워드를 오퍼랜드가 가리키는 레지스터 메모리위치로 복사하고

        SP를 2 증가 시킨다.


POPF  -  POP Flags off Stack

기능 : 스택에 PUSH시켜 놓았던 비트를 플래그 레지스터로 복사한 다음에 SP를

        2 증가 시킨다.


PUSH  -  PUSH Word

기능 : 스택에 원천 오퍼랜드의 워드를 복사하고 SP를 2 감소시킨다.


PUSHF  -  PUSH Flags onto Stack

기능 : SP를 2 감소시킨 다음에 플래그 레지스터의 내용을 스택에 복사한다.


RCL / RCR  -  Rotate Left through Carry and Rotate Right through Carry

기능 : 오퍼랜드의 비트들을 왼쪽 또는 오른 쪽으로 회전시킨다.

RET  -  Return from a Procedure

기능 : 앞서 CALL 명령어에 의해 호출되었던 피호출 프로시저로부터 호출프로시저로

        복귀하는데 사용된다.


ROL / ROR  -  Rotate Left and Rotate Right

기능 : 첫번째 오퍼랜드 비트들을 두 번째 오퍼랜드에서 지정한 비트 수만큼 왼쪽 또는

         오른쪽으로 회전시킨다.


SAHF  -  Store AH in Flag Register

기능 : AH의 내용을 플래그 레지스터의 하위 8비트에 복사한다.


SAL / SAR  -  Shift Arithmetic Left / Shift Arithmetic Right

기능 : 워드 또는 바이트를 왼/오른쪽으로 쉬프트 시킨다. 부호 있는 숫자를 쉬프트 할 때 사용


SBB  -  Subtract with Borrow

기능 : 목적지 오퍼랜드로부터 원천 오퍼랜드를 빼고 그 결과를 목적지 오퍼랜드에 저장한다.


SCAS / SCASB / SCASW  -  Scan Byte or Word String

기능 : ES:DI가 가리키는 스트링에 대해 AL 또는 AX에 있는 값이 있는지 조사한다.


SHL / SHR  -  Shift Left / Shift Right

기능 : 부호 없는 수에 사용되는 논리쉬프트로써 부호 비트도 데이터로 취급한다.


STC  -  Set Carry Flag

기능 : CF를 1로 세트 시킨다.


STD  -  Set Direction Flag

기능 : DF를 1로 세트 시킨다. 스트링 명령어와 사용


STI  -  Set Interrupt Flag

기능 : IF를 1로 세트 시킨다.


STOS / STOSB / STOSW  - Store Byte or Word String

기능 : AX, AL의 내용을 ES:DI가 가리키는 위치에 복사하고, DI를 1또는 2 증가시킨다.


SUB  -  Subtract

기능 : 목적지 오퍼랜드로부터 원천 오퍼랜드를 빼서 그 결과를 목적지에 저장한다.


TEST  -  Test Bits

기능 : 두 오퍼랜드에 대해 논리 AND를 수행하고 플래그를 설정하지만 두 오퍼랜드의 내용은

      변하지 않는다.


WAIT  -  Puts Processor in WAIT State

기능 : 마이크로프로세서로 하여금 외부 인터럽트가 발생할 때까지 대기상태에 들어가도록 한다.


XCHG  -  Exchange

기능 : 두 레지스터 또는 레지스터와 메모리 위치의 내용을 교환한다.


XLAT  -  Translate

기능 : AL의 내용을 AL이 가리키는 룩업 테이블의 내용으로 대체한다.


XOR  -  Exclusive OR

기능 : 두 오퍼랜드의 비트들에 대해 논리 XOR를 수행하여 그 결과를 목적지 오퍼랜드에 저장한다

Posted by 시긔양

댓글을 달아 주세요