어셈블리어 이 소스가 제가 생각한게 맞는지 여쭈어봅니다
안녕하세요?
어셈블리어 초보이다보니 궁금한게 이만저만이 아닙니다.
아무리 생각해도 내부적인 구조가 아직 이해가 안되서 이렇게 질문(4개..)을 드립니다.ㅜㅜ
제가 공부한 코드는 다음과 같은데요.,
; 프로그램 본체 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
1)
주석 처리한 소스가 있는데 제가 궁금한 곳이
putloop 부분과 msg 부분입니다.
entry 에 있는 MOV 명령어로부터 레지스터 SI 에 레이블 msg가 저장이 된후에
putloop 부분으로 들어가는데
여기서
MOV AL, [SI]
를 통해 msg 에서 처리한 결과를 AL 레지스터에 저장을 하는 방식인거 같습니다
제생각으로는 msg 부분을 다 수행한 결과를 메모리에 올립니다
그 후에 putloop 에서 msg 를 한바이트씩 읽음으로써 원하는 문자열을 출력해주는것 같습니다
확실치 않아서 그러는데 이 부분이 제가 생각한 방식으로 돌아가는 것이 맞는지 궁금합니다.
그리고
putloop 부분에서 다음과 같은 코드가 있습니다.
MOV AH, 0x0e MOV BX, 15 INT 0x10
2) 여기서 0x0e 가 단지 한문자씩 표시를 한다는 기계변수 같은걸까요?
레지스터 AH 에 0x0e 를 저장한다는 건데 어떤 의미인지 정확히 모르겠습니다.
3) MOV BX, 15 에서
베이스 레지스터에 15를 저장함으로써 글자 색을 바꾸는거 같은데
베이스 레지스터에 15를 저장하였다 해서 글자색이 바뀌는 원리를 잘 모르겠습니다.
4) INT 0x10 이 비디오 BIOS 호출을 한다고 하는데요
제가 INT 명령어에 대해서 조사를 해보았지만, INT 는 어떤 신호를 cpu에 보냈을때
cpu가 이벤트를 발생한다는 것이라고 하는데요. 0x10 을 통해서 BIOS 호출을
한다고 볼수 있을까요?
질문이 너무 길어졌습니다..
답변 부탁드립니다..
저 예제를 분석하기 위해 아셔야 할 개념들이 몇 가지 있습니다.
a. SI 레지스터의 용도
여기서는 msg 레이블로 마크되는 문자열의 시작 주소값을 저장하기 위해 사용 되었습니다.
b. DB 디렉티브의 이해
nasm류로 보이는데, nasm 공식 홈페이지의 doc에서 잘 설명하고 있습니다.
c. BIOS Interrupt Call의 이해, 호출 방식
http://en.wikipedia.org/wiki/BIOS_interrupt_call
d. int 0x10, ah=0xe 인터럽트
bx는 왜 설정한 것인지를 알 수 있습니다.
e. aseembly에서 간단한 함수 패턴의 사용
기회가 되신다면 '만들면서 배우는 OS 커널의 구조와 원리' 같은 기초서를 보시기 바랍니다.
----------------------
Go to the U-City
----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------
http://www.ctyme.com/intr/rb-
http://www.ctyme.com/intr/rb-0106.htm
바이오스 인터럽트 같은건 그냥 함수랑 비슷하다고 생각하시면 됩니다.
인자를 작성하는 것처럼 레지스터에 값을 집어넣고 인터럽트 호출만 하면 됩니다.
인터럽트는
http://www.ctyme.com/intr/int.htm 여기에서 찾아보시면 됩니다.
칼라는 잘 기억이 안나는데 8색이던가 16색이던가 얼마 안되는 색이 있습니다.
그냥 0부터 쭉 찍어보시면서 보시면 될 것 같습니다.
mov al, [si]는 si에 들어있는 주소에 있는 값을 al에 넣어라라고 보시면 되고 c언어에서 포인터 참조(*)와 비슷합니다.
while (ah != 0) {
ah = *msg;
msg++;
putchar(ah);
}
대충 이런 로직하고 비슷한겁니다.
그리고 저거 실행하시는 방법은 아시죠?
부트섹터부분에 그대로 기록하시고 그걸로 부팅하시면 됩니다.
댓글 달기