2014-09-19 44 views
0

我正在使用i686-elf作为gcc交叉编译器,它无法编译程序集文件。程序集 - 错误:表达式后的垃圾'40'

该文件用于一起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 
+0

'push byte 0'对我来说就像NASM语法。 – Michael 2014-09-19 16:24:11

回答

0

你混合英特尔和AT & T语法汇编语言。 GNU as传统上使用AT & T语法。英特尔语法是由汇编器使用的,例如NASM,MASM,YASM和为x86平台设计的历史汇编器。

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

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

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

+1

感谢您的帮助:) – FlabbyLlama 2014-09-19 16:37:32