Assembly (3)

이형섭·2023년 5월 21일
0

Code Segment만 존재하는 example

CODE SEGMENT
    ASSUME CS : CODE

    MOV AH, 12H
    MOV AL, 34H
    ADD AH, AL

    MOV AH, 4CH		; program 종료
    INT 21H

CODE ENDS  
    END    

Data 의사 명령어

  • Data를 memory에 할당하기 위해 Data Type을 Define함.
    • DB : Define Byte (1 byte)
    • DW : Define Word (2 bytes)
    • DD : Define Double Word (4 bytes)

Data Type의 저장 방법

CODE SEGMENT
    ASSUME CS : CODE, DS : DATA

    MOV AX, DATA
    MOV DS, AX 

    MOV DL, SCR_1
    MOV AH, 2
    INT 21H

    MOV CX, SCR_2
    MOV DL, CH 
    MOV AH, 2
    INT 21H

    MOV DL, CL
    MOV AH, 2
    INT 21H

    MOV AH, 4CH
    INT 21H

CODE ENDS

DATA SEGMENT
    SCR_1 DB 'A'        ; 1 Byte
    SCR_2 DW 4243H      ; 2 Bytes
DATA ENDS
    END

Addressing Mode(주소 지정 방식)

== Operand의 내용이나 장소를 지정하는 방식

1. Immediate addressing (즉치 주소 지정 방식)

  • Immediate addressing : 원하는 register에 직접 수치 대입

2. Direct addressing (직접 방식)

  • Direct addressing : Register의 내용을 원하는 register에 직접 전송
    (단, 두 register의 size가 같아야 함)

3. Memory reference addressing (간접 방식)

  • Memory reference addressing : 전송하는 값이 저장되어 있는 번지를 지정

PTR (= type casting)

  • Memory로 숫자를 move할 때, 크기 지정 필요
    • MOV BYTE PTR [BX], 12H
      ➡️ BX가 가리키는 주소에 12H를 move하는데, 1 byte로 move해라
    • MOV WORD PTR [BX], 3456H
      ➡️ BX가 가리키는 주소에 3456H를 move하는데, 2 bytes로 move해라

역워드 형식(Little Endian)

  • 16 bit register 상의 data를 memory에 전송할 때, 상하위 byte가 바뀐다.

주소 지정 방식 example

; 주소 지정 방식

CODE SEGMENT
    ASSUME CS : CODE , DS : CODE

CR EQU 0DH
LF EQU 00AH

    MOV AX, CODE
    MOV DS, AX 

    MOV BX, OFFSET BUFFER       ; BUFFER라는 data의 OFFSET주소값을 BX에 저장
    MOV SI, 2                   ; SI = 2

    MOV DL, [BX + SI]           ; DL = BUFFER라는 data의 OFFSET주소 + 2 = 'e'의 주소 + 2 = 'a'
    MOV AH, 2                   
    INT 21H                     ; DL 출력 : 'a'

    MOV DL, [BX + SI + 1]       ; DL = BUFFER라는 data의 OFFSET주소 + 2 + 1 = 'e'의 주소 + 3 = 'm'
    MOV AH, 2
    INT 21H

    MOV DL, CR                  ; Carrige Return (줄바꿈)
    MOV AH, 2
    INT 21H
    
    MOV DL, LF                  ; Line Feed (줄바꿈)
    MOV AH, 2
    INT 21H

    MOV DL, [BX + SI + 2]       ; DL = BUFFER라는 data의 OFFSET주소 + 2 + 2 = 'e'의 주소 + 4 = 'p'
    MOV AH, 2
    INT 21H

    MOV AH, 4CH                 ; program 종료
    INT 21H

BUFFER DB 'example.'

CODE ENDS
    END

덧셈 명령

ADD (addition)

ADC (addition with carry)

  • 32bit끼리의 덧셈을 할 때는,
    하위 16bit는 ADD를 하고,
    하위 연산에서 carry가 발생할지도 모르기 때문에 상위 16bit는 ADC를 하는 것이 맞다.
CODE SEGMENT
    ASSUME CS : CODE, DS : DATA

    MOV AX, DATA
    MOV DS, AX

    MOV AX, 1223H
    MOV BX, 8000H
    MOV CX, 2000H
    MOV DX, 8123H

    ADD BX, DX          ; Carry Flag가 1로 set
    ADC AX, CX          ; Carry와 함께 덧셈

    MOV VAR1, AX 
    MOV VAR2, BX 

    MOV AH, 4CH
    INT 21H

CODE ENDS

DATA SEGMENT    
    VAR1 DW ?           ; 초기화 X
    VAR2 DW ?           ; 초기화 X
DATA ENDS
    END

0개의 댓글