Assembly (5)

HyungSeop Lee·2023년 5월 22일
0

방법 1

main segment 

    assume cs : main, ds : main 

    MOV AX, CS 
    MOV DS, AX 

    MOV AX, A 
    ADD AX, B 
    MOV SUM, AX 

    MOV AX, 4C00H
    INT 21H

A DW 2
B DW 5
SUM DW ?

main ends 
    end

잘못된 방법

main segment 

    assume cs : main, ds : main 

    A DW 2
    B DW 5
    SUM DW ?

START :
    MOV AX, A   
    ADD AX, B 
    MOV SUM, AX 

    MOV AX, 4C00H
    INT 21H

main ends 
    end 
  • 우리가 쓰지 않은 code들이 나와있다.
    왜냐하면
    이 부분이 Data가 Code로 인식되었기 때문이다.
    assembly는 위의 data 영역 목적으로 쓴 것이 data인지 code인지 구분하지 않기 때문에
    code segment이기 때문에 code로 인식해버린다.

위 문제점을 해결하기 위해 방법 2.

방법 2

  • END 뒤에 START를 넣어서 시작점의 위치를 알려줌.

Test (byte 단위로 바꾸고 Carry Flag)

Test 2 (Segment 분리)

AL의 값 00을 [0002]에 저장

그러면

A : FF
B : 01
SUM : 00

이라는 값은 어딘가에 저장되어 있을 건데,

어디에 있을까?
DS가 586번지부터이므로 586번지의 0000번지에 있을까?
➡️ 아니다.

  • 확인해보면, 다음과 같다.
    0584의 0020, 0021, 0022 번지에
    A(FF), B(01), SUM(00)이 있다.

    왜 0584의 0020부터 있을까?

    segment가 0584에서 0586로 바뀐 과정을 보면,
    물리번지 : 05840 + offset 이기 때문에
    05860 - 05840 = 0x20 이다.
    따라서 code segment에서 2개의 segment 밑에 data segment를 잡았는데,
    0x20의 차이가 나는 것이라
    0584의 0020 번지에 있는 것이다.
    또한 code segment는 0584의 0013번지에 종료되므로
    data segment를 0584의 0020에 잡을 수 있다.
    만약 code segment가 0584의 0021번제이 종료되었다면
    data segment를 0584의 0040에 잡아줬을 것이다.
    (→ 최소한의 memory를 잡도록)

profile
efficient computer vision

0개의 댓글