2014-09-19 38 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