2012年2月11日星期六

gas 定址基本語法


不算熟悉, gas 語法, 寫一篇記下來, 可能會有一些錯誤。
L8 - L10: 將 0x42 寫入記憶體 0000:0000 的位址。

L12: 將 0000:0000 的 1 byte 複製到 %al
L14: 寫入 b800:0000
L19: 寫入 b800:0002, 透過將 %edi 設為 2
L21, L26: 測試 $BootMessage 和BootMessage 的用法。
L22: 1(%bx) 為 gnu AT&T 定址語法。

boot_practice.S
 1 .code16
2 .text
3 mov %cs,%ax
4 mov %ax,%ds
5 mov %ax,%es
6 mov $0xB800, %ax
7 mov %ax, %gs
8 mov $0x0, %ax
9 mov %ax, %es
10 movb $0x42, %es:0 # move immediate value (0x42 = 'B') to address 0000:0000, es -> 0
11
12 movb %es:0, %al
13 mov $0x0c, %ah # red color
14 mov %ax, %gs:(0)
15
16 mov $2, %edi
17
18 mov $0x41, %al
19 mov %ax, %gs:(%edi)
20
21 mov $BootMessage, %bx
22 movb %ds:1(%bx), %al
23 movb 1(%bx), %al
24 mov %ax, %gs:(4)
25
26 movb BootMessage, %al
27 mov %ax, %gs:(6)
28
29 jmp .
30 DispStr:
31 mov $BootMessage, %ax
32 mov %ax,%bp
33 mov $16,%cx
34 mov $0x1301,%ax
35 mov $0x00c,%bx
36 mov $0,%dl
37 int $0x10
38 ret
39 BootMessage:.ascii "Hello, OS world!"
40
41 .org 510
42 .word 0xaa55
43



0 意見: