as编译.macro 和ljmp 时出现错误 不解。。
7 .section .data
8 .include "boot.h"
9 #GDT
10 #----------------------------base, limit,attr
11
12 LABEL_GDT:
13 descriptor 0, 0, 0 /*空描述符*/
14 LABEL_CODE32:
15 descriptor 0, ($Seg32_len-1), ($CAttr_XW+$Attr_32)
16 LABEL_VIDEO:
17 descriptor 0x0B8000, 0xFFFF, $DAttr_RW
18
19 .equ GDT_len, . - $LABEL_GDT /*GDT的长度*/
20
21 GDT_PTR:
22 .word $GDT_len
23 .4byte 0 /*GDT基址*/
24
25 #GDT选择子
26 .equ Selector_Code32, $LABEL_CODE32 - $LABEL_GDT
27 .equ Selector_Video, $LABEL_VIDEO - $LABEL_GDT
28
29
30 .section .text
31 .globl _start
32 .code16
33 _start:
34 movw %cs, %ax
35 movw %ax, %ds
36 movw %ax, %es
37 movw %ax, %ss
38 movw $0x0200, %sp
39
40 #初始化32位代码段描述符 把cs:ip 地址存到描述符中的基址
41 xor %eax, %eax
42 movw %cs, %ax
43 shll $4, %eax
44 addl $LABEL_SEG32_START, %eax
45 movw %ax, LABEL_CODE32 + 2
46 shrl $16, %eax
47 movb %al, LABEL_CODE32 + 4
48 movb %ah, LABEL_CODE32 + 7
49
50 #为加载GDTR 作准备
51 xor %eax, %eax
52 movw %ds, %ax
53 shll $4, %eax
54 addl $LABEL_GDT, %eax
55 movl %eax, GDT_PTR+2
56
57 #加载GDTR
58 lgdt GDT_PTR
59
60 #关中断
61 cli
62
63 #打开A20
64 in $0x92, %al
65 or $0x04, %al
66 out %al, $0x92
67
68 #写cr0 PE位
69 xor %eax, %eax
70 movl %cr0, %eax
71 or $0x01, %eax
72 movl %eax, %cr0
73
74 ljmp $Selector_Code32, $0
75
76 .section .text32
77 .code32
78
79 #保护模式
80 LABEL_SEG32_START:
81 movw $Selector_Video, %ax
82 movw %ax, %gs
83 # movl (80*10 + 0)*2, %edi
84 movb $0x0C, %ah
85 movb $'P', %al
86 movw %ax, %gs: 80*10 + 0)*2
87 jmp .
88
89 .equ Seg32_len, . - $LABEL_SEG32_START
90
91
[root@server bootloader]# as test.S -o test.o
test.S: Assembler messages:
test.S:15: Error: no such instruction: `descriptor 0,($Seg32_len-1),($CAttr_XW+$Attr_32)'
test.S:17: Error: no such instruction: `descriptor 0x0B8000,0xFFFF,$DAttr_RW'
test.S:74: Error: can't handle non absolute segment in `ljmp'
为什么出现这3个错误
boot.h:
19 .macro descriptor base, limit, attr
20
21 .word \limit & 0xffff /*段界限*/
22 .word \base & 0xffff /*段基址1*/
23 .byte (\base >> 16) & 0xff
24 .word (\limit >> 8 & 0x0f00 | \attr & 0xf0ff /*属性1 + 段界限 + 属性2*/
25 .byte (\base >> 24)& 0xff /*段基址3*/
26
27 .endm
43 .equ Attr_32, 0x4000 #32位代码
44 .equ Attr_DPL0, 0x00 #DPL值
45 .equ Attr_DPL1, 0x20
46 .equ Attr_DPL2, 0x40
47 .equ Attr_DPL3, 0x60
48
49 /*数据段相关*/
50 .equ DAttr_R, 0x90 #只读代码段
51 .equ DAttr_RA, 0x91 #只读已访问代码段
52 .equ DAttr_RW, 0x92 #可读写代码段
53 .equ DAttr_RWA, 0x93 #可读写已访问代码段
54
55 /*代码段相关*/
56 .equ CAttr_X, 0x98 #只执行
57 .equ CAttr_XA, 0x99 #只执行 已访问
58 .equ CAttr_XW, 0x9A #执行\写
59 .equ CAttr_XWA, 0x9B #执行\写 已访问
60 .equ CAttr_XC, 0x9C #只执行 一致代码
61 .equ CAttr_XCA, 0x9D #只执行 已访问 一致代码
62 .equ CAttr_XWC, 0x9E #执行\写 一致代码
63 .equ CAttr_XWCA,0x9F #执行\写 已访问 一致代码
64
65 /*系统段相关*/
66 .equ SAttr_LDT, 0x82 #局部描述符
67 .equ SAttr_TASK, 0x85 #任务门
68 .equ SAttr_TSS, 0x89 #TSS
69 .equ SAttr_CALL, 0x8C #调用门
70 .equ SAttr_INTR, 0x8E #中断门
71 .equ SAttr_TRAP, 0x8F #陷阱门
[ 本帖最后由 317316abcd 于 2008-10-11 14:48 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论