1

我不确定我是否做错了什么。我正在使用英特尔芯片的 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)。组装和链接没有问题。但它无法运行并出现分段错误。为什么失败以及如何更正代码?

4

3 回答 3

3

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

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

  1. Linux Assembly 介绍 4.1 DOS 和 Linux Assembly 的主要区别

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

于 2013-10-18T02:39:25.440 回答
3

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

于 2013-10-18T02:44:05.850 回答
1

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

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

于 2013-10-18T05:30:07.250 回答