as编译.macro 和ljmp 时出现错误 不解。。

发布于 2022-09-22 12:13:04 字数 7541 浏览 18 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文