gpt4 book ai didi

c - assembly - 错误 : junk '40' after expression

转载 作者:行者123 更新时间:2023-11-30 17:28:48 29 4
gpt4 key购买 nike

我正在使用 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 语法。 NASM、MASM、YASM 等汇编器以及为 x86 平台设计的历史汇编器使用 Intel 语法。

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

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

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

关于c - assembly - 错误 : junk '40' after expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25938151/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com