2017-01-14 9 views
2

私はアセンブリでhello worldブートローダを書くためのチュートリアルに従っており、x-86マシン用にNASMアセンブラを使用しています。私はいくつかの困難が、私はDBコマンドを使用して1バイトに完了「のHello World」という文字列を置くことができる方法を理解していアセンブリーで文字列を宣言するためにdbを使用する

[BITS 16] ;Tells the assembler that its a 16 bit code 
[ORG 0x7C00] ;Origin, tell the assembler that where the code will 
      ;be in memory after it is been loaded 

MOV SI, HelloString ;Store string pointer to SI 
CALL PrintString ;Call print string procedure 
JMP $  ;Infinite loop, hang it here. 


PrintCharacter: ;Procedure to print character on screen 
;Assume that ASCII value is in register AL 
MOV AH, 0x0E ;Tell BIOS that we need to print one charater on screen. 
MOV BH, 0x00 ;Page no. 
MOV BL, 0x07 ;Text attribute 0x07 is lightgrey font on black background 

INT 0x10 ;Call video interrupt 
RET  ;Return to calling procedure 



PrintString: ;Procedure to print string on screen 
;Assume that string starting pointer is in register SI 

next_character: ;Lable to fetch next character from string 
MOV AL, [SI] ;Get a byte from string and store in AL register 
INC SI  ;Increment SI pointer 
OR AL, AL ;Check if value in AL is zero (end of string) 
JZ exit_function ;If end then return 
CALL PrintCharacter ;Else print the character which is in AL register 
JMP next_character ;Fetch next character from string 
exit_function: ;End label 
RET  ;Return from procedure 


;Data 
HelloString db 'Hello World', 0 ;HelloWorld string ending with 0 

TIMES 510 - ($ - $$) db 0 ;Fill the rest of sector with 0 
DW 0xAA55   ;Add boot signature at the end of bootloader 

:これは私が使用していたコードです。私が理解しているように、dbはの定義で、バイトを定義しており、上記のバイトを実行可能ファイルに直接配置しますが、確かに 'Hello World'はバイトより大きくなります。私はここで何が欠けていますか?

+3

文字列が 'db'に現れると、文字列はそれぞれの文字に自動的に分割され、連続するバイトに格納されます。 'HelloString db 'Hello World'、0'は、' HelloString db 'として扱われ、 'H'、 'e'、 'l'、 'l'、 'o'、 ''、 'W'、 'o' 'r'、 'l'、 'd'、0 ' –

答えて

4

疑似命令dbdwddや友人can define multiple items

db 34h    ;Define byte 34h 
db 34h, 12h  ;Define bytes 34h and 12h (i.e. word 1234h) 

彼らはあまりにも

db 'H', 'e', 'l', 'l', 'o', 0 

文字定数を受け付けますが、この構文は、文字列の厄介なので、次の論理的なステップを与えることでした明示的サポート

db "Hello", 0   ;Equivalent of the above 

P.S.一般にprefer the user-level directivesであるが、[BITS]および[ORG]については無関係である。

関連する問題