어셈블리 소스 부분 여쭈어봅니다.

victoryz12의 이미지

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 라는 명령어에 대해서 추가 질문 드립니다..

이상입니다..

답변 부탁드립니다..

keke111의 이미지

소프트웨어 인터럽트의 존재를 아시면 됩니다.

아직 소프트웨어 인터럽트를 모르시는것 보니.. 초보이신것 같은데요.
좀더 어셈을 공부하시다 보면 자연스레 나오니 좀더 진행해 보시기 바랍니다.

DB 명령어도 좀더 보시면 나옵니다.

참고로 DB = byte, DW = word, DD = double 입니다.

victoryz12의 이미지

3주 하계 훈련 마치고 훌륭한 답변 감사드립니다 많은 도움이 되었습니다^^

ifree의 이미지

어셈 언어로 화면 출력을 하거나 입력을 받거나 등의 일을 하기 위해 소프트웨어 인터럽트를 사용합니다.

int INT_Number

의 형태인데 INT_Number 는 0-255 의 수로 수행되는 인터럽트의 종류를 나타내며 시스템의 인터럽트 테이블에 인터럽트 함수 주소가 저장되어 있습니다,

int 10h 는 비디오 인터럽트인데 비디오 인터럽트도 여러 가지가 있기 때문에 ah 에 비디오 인터럽트의 종류를 설정하고 al 에 이 인터럽트에 필요한 데이터를 넣습니다. 추가적인 데이터를 위해 bx 레지스터를 사용하기도 합니다.

위의 경우 ah 에 들어가는 0eh 는 비디오 인터럽트 중 화면 출력을 나타내고, 출력하기 위한 문자가 al 에 들어갑니다. 추가로 출력되는 글자색을 bx 에 넣어 줍니다.

db(define byte) 는 단순히 텍스트나 그림 등의 데이터를 정의하기 위한 장소를 확보하기 위한 명령입니다.
하지만 어셈 명령어들의 기계어 코드를 알면 명령어를 쓰지 않고 db 만으로 어셈블리 프로그램을 작성할 수 있죠.(이게 사실 상당히 재미있다는, 더 맛들이면 다음 단계는 헥사 편집기로 바로 실행 파일 만들기)

victoryz12의 이미지

3주 하계 훈련 마치고 훌륭한 답변 감사드립니다 많은 도움이 되었습니다^^

swirlpotato의 이미지

ax를 통짜로 안쓰고 ah al 쪼개서 쓰는 이유는 최대한 레지스터를 적게 이용해야지 코드 작성의 효율성도 올라갈 뿐더러 성능도 올라갑니다.
그렇지 않으면 인터럽트를 이용할때마다 많은 레지스터를 스택에 푸쉬해야하고 팝해야하는데 메모리 관련 IO를 많이 이용하는 것은 성능 하락의 원인이 됩니다.

제가 얼마전에 댓글로 소프트웨어 인터럽트 테이블 링크 올려드렸는데 그거 안 보셨나요?
랄프의 인터럽트 테이블이던가(영어로) 그걸로 구글 검색하면 나옵니다.

victoryz12의 이미지

3주 하계 훈련 마치고 훌륭한 답변 감사드립니다 많은 도움이 되었습니다^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.