어셈블리어 이 소스가 제가 생각한게 맞는지 여쭈어봅니다

victoryz12의 이미지


안녕하세요?

어셈블리어 초보이다보니 궁금한게 이만저만이 아닙니다.

아무리 생각해도 내부적인 구조가 아직 이해가 안되서 이렇게 질문(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 호출을
한다고 볼수 있을까요?

질문이 너무 길어졌습니다..

답변 부탁드립니다..

freestyle의 이미지

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!
----------------------------------------------------------------------------------------

swirlpotato의 이미지

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);
}

대충 이런 로직하고 비슷한겁니다.

그리고 저거 실행하시는 방법은 아시죠?
부트섹터부분에 그대로 기록하시고 그걸로 부팅하시면 됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.