装配 - 错误:垃圾' 40'表达后

时间:2014-09-19 16:08:36

标签: c assembly

我使用的是i686-elf-as gcc交叉编译器,而且它无法编译汇编文件。

该文件与grub一起用于启动我自己的操作系统但是当我尝试定义任何全局变量或输入_irq部分时,它会吐出大量错误,主要是

boot.s:78: Error: no such instruction: `irq4'
boot.s:81: Error: junk `0' after expression
boot.s:82: Error: junk `36' after expression

我如何阻止这种情况发生?

以下是整个boot.s文件

# Declare constants used for creating a multiboot header.
.set ALIGN,    1<<0             
.set MEMINFO,  1<<1             
.set FLAGS,    ALIGN | MEMINFO  
.set MAGIC,    0x1BADB002       
.set CHECKSUM, -(MAGIC + FLAGS)

.section .multiboot
.align 4
.long MAGIC
.long FLAGS
.long CHECKSUM

.section .bootstrap_stack, "aw", @nobits
stack_bottom: 
.skip 16384 # 16 KiB
stack_top:

.section .text
.global _start
.type _start, @function
_start:
    movl $stack_top, %esp

    call kernel_main

    cli
    hlt
.Lhang:
    jmp .Lhang


.global _irq0
.global _irq1
.global _irq2
.global _irq3
.global _irq4
.global _irq5
.global _irq6
.global _irq7
.global _irq8
.global _irq9
.global _irq10
.global _irq11
.global _irq12
.global _irq13
.global _irq14
.global _irq15

_irq0:
    cli
    push byte 0
    push byte 32
    jmp irq_common_stub

_irq1:
    cli
    push byte 0
    push byte 33
    jmp irq_common_stub

_irq2:
    cli
    push byte 0
    push byte 34
    jmp irq_common_stub

_irq3:
    cli
    push byte 0
    push byte 35
    jmp irq_common_stub

_irq4:
    cli
    push byte 0
    push byte 36
    jmp irq_common_stub

_irq5:
    cli
    push byte 0
    push byte 37
    jmp irq_common_stub

_irq6:
    cli
    push byte 0
    push byte 38
    jmp irq_common_stub

_irq7:
    cli
    push byte 0
    push byte 39
    jmp irq_common_stub

_irq8:
    cli
    push byte 0
    push byte 40
jmp irq_common_stub

_irq9:
    cli
    push byte 0
    push byte 41
    jmp irq_common_stub

_irq10:
    cli
    push byte 0
    push byte 42
    jmp irq_common_stub

_irq11:
    cli
    push byte 0
    push byte 43
    jmp irq_common_stub

_irq12:
    cli
    push byte 0
    push byte 44
    jmp irq_common_stub

_irq13:
    cli
    push byte 0
    push byte 45
    jmp irq_common_stub

_irq14:
    cli
    push byte 0
    push byte 46
    jmp irq_common_stub

_irq15:
    cli
    push byte 0
    push byte 47
    jmp irq_common_stub

extern _irq_handler

irq_common_stub:
    pusha
    push %ds
    push %es
    push %fs
    push %gs

    mov %ax, 0x10
    mov %ds, %ax
    mov %es, %ax
    mov %fs, %ax
    mov %gs, %ax
    mov %eax, %esp

    push %eax
    mov %eax, _irq_handler
    call eax
    pop %eax

    pop %gs
    pop %fs
    pop %es
    pop %ds
    popa
    add %esp, 8
    iret

.size _start, . - _start

1 个答案:

答案 0 :(得分:0)

您正在混合使用英特尔和AT&amp; T语法汇编语言。 GNU as传统上使用AT&amp; T语法。英特尔语法是由汇编程序(如NASM,MASM,YASM和为x86平台设计的历史汇编程序)使用的。

movl $stack_top, %esp是AT&amp; T语法汇编语言的完美有效示例。 push byte 35是英特尔语法汇编语言的完美有效示例。但是,这两种语法不兼容,无法组合。

我建议在Linux上查找使用as的汇编语言教程,并在开始进入与系统开发一样复杂和令人头疼的事情之前,首先学习如何使用汇编语言。 ;)

http://asm.sourceforge.net/ - 也许这个教程/资源网站对您有用。祝你好运!