TITLE LOOP.ASM
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
.CODE
MAIN:
MOV AX, @DATA
MOV DS, AX
MOV CX, 8H
MOV AL, 3AH
AGAIN1:
MOV DL, AL
;MOV DL, 3AH
SUB DL, CL
MOV AH, 02H
INT 21H
LOOP AGAIN1
;
MAINOUT:
MOV AH, 4CH
INT 21H
END MAIN


어셈블리어 공부를 해본 적이 있다면,
출력결과를 예상해보기 보란다
'23456789' 라고 추측하였기를..

하지만,
어셈블러를 통해 해석 후 실행시켜보면,
출력결과는 아마도
2!@$%!%@#&^
이따구 모양이 나올 것이다

도대체, 왜 그러는가;

물론, MOV DL, AL 명령을 MOV DL, 3AH 로 수정하면,
원하는 결과를 얻을 수 있다.

그냥 그냥 그런데로 넘어갈까 하다가,
당연히 바르게 돌아갈꺼 같은 코드가 엉뚱한 결과를 내버리니,
도저히 참을 수가 없어서,
원인분석을 좀 해보려고 미친듯이 삽질하다가 결국 포기해버렸다. OTL;



혹시, 원인을 발견하셨다면
저에게 뜨거운 감동을 전해주세요~*

내가 사용했던 어셈블러와 링커^^;

Creative Commons License
Creative Commons License
http://min9nim.kr/trackback/91 관련글 쓰기
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. Favicon of http://neofeel.pe.kr/ BlogIcon neofeel 2006/05/06 11:56  댓글주소  수정/삭제  댓글쓰기

    인터럽트 호출후 AL값이 변하는 군요.

    INT 21 - DOS 1+ - WRITE CHARACTER TO STANDARD OUTPUT

    AH = 02h
    DL = character to write
    Return: AL = last character output (despite the official docs which state
    nothing is returned) (at least DOS 2.1-7.0)
    Notes: ^C/^Break are checked, and INT 23 executed if pressed
    standard output is always the screen under DOS 1.x, but may be
    redirected under DOS 2+
    the last character output will be the character in DL unless DL=09h
    on entry, in which case AL=20h as tabs are expanded to blanks
    if standard output is redirected to a file, no error checks (write-
    protected, full media, etc.) are performed

    • Favicon of http://min9.net BlogIcon 밍구^^& 2006/05/06 12:39  댓글주소  수정/삭제

      감사합니다ㅠㅠ;
      저도 분명히 AL 값이 어디선가 바뀐다고 판단해서 루프를 돌면서 AL 값을 (INT 21H,AH=02H) 명령을 통해서 수 차례 확인해본 결과, 바뀌지 않고 일정한 값이 나옴을 확인하고서, 도대체 모가 어떻게 된건지 전혀 이해를 못했는데, 지금 보니까, 방금전에 출력했던 문자가 AL 안으로 들어가 버리는 거였군요;
      그러니까, 당연히 AL에 있는 값을 확인해봤자 바뀌지 않는다고 판단할 수 밖에 없지ㅡㅡ;
      AL 만 BL 로 살짝 바꿔주니까, 잘 돌아가더군요ㅋ
      아무튼, 중요한 깨달음을 하나 얻었습니다. 출력값이 똑같다고 변수의 값이 바뀌지 않고 있다고 판단한 것이 제가 헤매었던 이유였네요ㅡㅡ;; 정말, 다소 황당하며 아~ 그럴 수도 있구나 하는 깨달음을 얻었습니다