簡體   English   中英

匯編-錯誤:表達式后為垃圾“ 40”

[英]Assembly - Error: junk '40' after expression

我正在使用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

您正在混合使用Intel和AT&T語法匯編語言。 GNU as使用AT&T語法傳統。 Intel語法是NASM,MASM,YASM等匯編程序以及為x86平台設計的歷史匯編程序所使用的語法。

movl $stack_top, %esp是AT&T語法匯編語言的完美示例。 push byte 35是Intel語法匯編語言的一個非常有效的示例。 但是,這兩種語法是不兼容的,不能組合使用。

我建議找一個使用匯編語言教程as在Linux上,並學習如何跳進東西一樣復雜和頭痛誘導的系統開發之前使用匯編語言在首位。 ;)

http://asm.sourceforge.net/-也許該教程/資源站點對您有用。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM