어셈블리 소스 부분 여쭈어봅니다.
글쓴이: victoryz12 / 작성시간: 토, 2010/07/24 - 10:18오후
entry: MOV AX, 0 ; 레지스터 초기화 MOV SS,AX MOV SP,0x7c00 MOV DS,AX MOV ES,AX MOV SI,msg putloop: MOV AL,[SI] ADD SI, 1 ; SI에 1을 더한다 CMP AL,0 JE fin MOV AH, 0x0e ; 한 글자 표시 Function MOV BX, 15 ; 칼라 코드 INT 0x10 ; 비디오 BIOS 호출 JMP putloop fin: HLT ; 무엇인가 있을 때까지 CPU를 정지시킨다 JMP fin ; Endless Loop msg: DB 0x0a, 0x0a ; 개행을 2개 DB "hello, world" DB 0x0a ; 개행 DB 0 RESB 0x7dfe-$ ; 0x7dfe까지를 0x00로 채우는 명령 DB 0x55, 0xaa
코드로부터
entry 레이블에서 MOV SI, msg 는 msg 레이블의 주소를 SI 레지스터에 대입한다라는 뜻으로 알고 있습니다.
따라서 msg 레이블에서 처리한 메모리의 정보가 SI 에 저장되었고,
putloop 에서 SI 가 ADD SI, 1 을 통해 메모리를 한 칸씩 보면서, 문자 하나하나씩 살피는 걸로 알고 있습니다.
그런데 MOV AH, 0x0e 가 무엇을 뜻하는지 모르겠습니다. 0x0e 라는 자체가 한 문자를 표시 하게끔 하는 요인 같은 것이 되나요?
그리고 왜 굳이 AX를 AL, AH 로 구분하여 쓰는지 모르겠습니다.
AL 이 [SI] 로부터 메모리 정보를 받아온다면, AH는 한문자 표시기능이라는 정보를 받아서 메모리로부터 받은
데이터(문자)를 하나하나씩 레지스터 AX 에 담는 것으로 이해해야 할까요?
그리고 마지막으로 putloop 레이블에서 INT 0x10 명령이 비디오 BIOS 호출을 한다고 되어있는데
0x10의 개념이 너무 이해가 되지 않습니다. 0x10이 어떤 함수 같은 건가요? 그렇다면 0x11 이런 것도 있는지 궁금합니다.
아 그리고 DB 라는 명령어에 대해서 추가 질문 드립니다..
이상입니다..
답변 부탁드립니다..
Forums:
일단...
소프트웨어 인터럽트의 존재를 아시면 됩니다.
아직 소프트웨어 인터럽트를 모르시는것 보니.. 초보이신것 같은데요.
좀더 어셈을 공부하시다 보면 자연스레 나오니 좀더 진행해 보시기 바랍니다.
DB 명령어도 좀더 보시면 나옵니다.
참고로 DB = byte, DW = word, DD = double 입니다.
3주 하계 훈련 마치고
3주 하계 훈련 마치고 훌륭한 답변 감사드립니다 많은 도움이 되었습니다^^
어셈 언어로 화면
어셈 언어로 화면 출력을 하거나 입력을 받거나 등의 일을 하기 위해 소프트웨어 인터럽트를 사용합니다.
int INT_Number
의 형태인데 INT_Number 는 0-255 의 수로 수행되는 인터럽트의 종류를 나타내며 시스템의 인터럽트 테이블에 인터럽트 함수 주소가 저장되어 있습니다,
int 10h 는 비디오 인터럽트인데 비디오 인터럽트도 여러 가지가 있기 때문에 ah 에 비디오 인터럽트의 종류를 설정하고 al 에 이 인터럽트에 필요한 데이터를 넣습니다. 추가적인 데이터를 위해 bx 레지스터를 사용하기도 합니다.
위의 경우 ah 에 들어가는 0eh 는 비디오 인터럽트 중 화면 출력을 나타내고, 출력하기 위한 문자가 al 에 들어갑니다. 추가로 출력되는 글자색을 bx 에 넣어 줍니다.
db(define byte) 는 단순히 텍스트나 그림 등의 데이터를 정의하기 위한 장소를 확보하기 위한 명령입니다.
하지만 어셈 명령어들의 기계어 코드를 알면 명령어를 쓰지 않고 db 만으로 어셈블리 프로그램을 작성할 수 있죠.(이게 사실 상당히 재미있다는, 더 맛들이면 다음 단계는 헥사 편집기로 바로 실행 파일 만들기)
3주 하계 훈련 마치고
3주 하계 훈련 마치고 훌륭한 답변 감사드립니다 많은 도움이 되었습니다^^
ax를 통짜로 안쓰고 ah
ax를 통짜로 안쓰고 ah al 쪼개서 쓰는 이유는 최대한 레지스터를 적게 이용해야지 코드 작성의 효율성도 올라갈 뿐더러 성능도 올라갑니다.
그렇지 않으면 인터럽트를 이용할때마다 많은 레지스터를 스택에 푸쉬해야하고 팝해야하는데 메모리 관련 IO를 많이 이용하는 것은 성능 하락의 원인이 됩니다.
제가 얼마전에 댓글로 소프트웨어 인터럽트 테이블 링크 올려드렸는데 그거 안 보셨나요?
랄프의 인터럽트 테이블이던가(영어로) 그걸로 구글 검색하면 나옵니다.
감사합니다.
3주 하계 훈련 마치고 훌륭한 답변 감사드립니다 많은 도움이 되었습니다^^
댓글 달기