【问题标题】:Why is this int $0x10 BIOS INT not working on Linux?为什么这个 int $0x10 BIOS INT 在 Linux 上不起作用?
【发布时间】:2013-10-26 18:08:12
【问题描述】:

我不确定我是否做错了什么。我正在使用英特尔芯片的 linux 机器上学习 AT&T 语法中的汇编语言。我了解到 INT 10H 用于为各种视频目的调用 BIOS 子例程。

我写了这个简单的汇编代码来清屏。

.section .data

data_items:

.section .text

.global _start
_start:

mov $6, %ah        #  to select the scroll function
mov $0, %al        #  the entire page
mov $7, %bh        #  for normal attribute
mov $0, %ch        #  row value of the start point
mov $0, %cl        #  column value of the starting point
mov $24, %dh       #  row value of ending point
mov $79, %dl       #  column value of the ending point
int $0x10          #  invoke the BIOS INT 10H interrupt 

movl $1, %eax      #  exiting the program
int $0x80

我在 gnome 终端中组装了它(使用英特尔芯片上的 fedora 19)。组装和链接没有问题。但它无法运行并出现分段错误。为什么会失败以及如何更正代码?

【问题讨论】:

  • 考虑到这对我来说甚至没有链接 xD(这是 GAS 对吗?)我不确定我能帮忙。
  • 你用的是什么汇编程序?
  • 来自 gnu 的气体。我得到了答案。 int 10 根本不打算在 linux 中使用。它是 DOS/windows 的东西。

标签: linux assembly x86 bios


【解决方案1】:

啊哈,得到答案了。我完全做错了。 INT 10H 是 DOS/windows 的东西,根本不是 LINUX。

http://docs.cs.up.ac.za/programming/asm/derick_tut/#maindiff

  1. Linux 汇编简介 4.1 DOS和Linux汇编的主要区别

    在 DOS 汇编中,大多数事情都是通过 DOS 服务中断 int 21h 完成的,而 BIOS 服务中断如 int 10h 和 诠释 16 小时。在 Linux 中,所有这些功能都由内核处理。 一切都通过“内核系统调用”完成,你调用 具有int 80h的内核。

【讨论】:

  • 或者在 x86-64 Linux 上,使用 syscall 指令,而不是 int 0x80
【解决方案2】:

Linux 和所有现代系统都在保护模式下运行,当系统处于此模式时,无法调用 BIOS 中断。您可以使用DOSBox 在Linux 中模拟DOS。

【讨论】:

    【解决方案3】:

    Linux Int 80h 用于调用系统函数。有一个很棒的 assembly oriented SDK 可以帮助您开始 Linux 汇编编程。

    有例子,包含文件和系统函数帮助。这个 SDK 基于FASM,但它甚至更好,因为它的语法更易读,宏功能也很棒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多