【问题标题】:Assembly - Error: junk '40' after expression程序集 - 错误:表达式后出现垃圾“40”
【发布时间】:2014-09-19 16:08:36
【问题描述】:

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

【问题讨论】:

  • push byte 0 在我看来像 NASM 语法。

标签: c assembly


【解决方案1】:

您正在混合使用 Intel 和 AT&T 语法汇编语言。 GNU as 传统上使用 AT&T 语法。 Intel 语法是 NASM、MASM、YASM 等汇编程序以及为 x86 平台设计的历史汇编程序所使用的语法。

movl $stack_top, %esp 是 AT&T 语法汇编语言的完美示例。 push byte 35 是 Intel 语法汇编语言的完美示例。然而,这两种语法是不兼容的,不能组合使用。

我建议在 Linux 上查找使用 as 的汇编语言教程,并首先学习如何使用汇编语言,然后再进行系统开发这样复杂且令人头疼的事情。 ;)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多