【问题标题】:Can i use interrupts in inline assembly [SOLVED]我可以在内联汇编中使用中断吗[已解决]
【发布时间】:2022-08-11 23:34:53
【问题描述】:

我想在内联 asm 中使用中断,但它不允许我认为我的应用程序是这样的

__asm__(\"movb %ah,9;\" 
\"movb %al,0x41;\" 
\"movb %bh,0x0;\" 
\"movw %cx,0x1; \"
\"movb %bl,0x0F ;\" 
\"int $10; \");

运行这只是一个空白区域后我什么也没有得到我该怎么办?

  • 你想用这个中断来完成什么,它是否可以在不使用中断的情况下完成?
  • 你在做什么?操作系统?视窗?还有什么? int 指令实际上是一个系统调用。你期望这个系统调用做什么?你是什​​么意思你得到一个空格?还有其他输出吗?你如何运行程序?你怎么知道有一个空白而不是什么都没有?
  • 第一个注意是它是中断0x10,而不是10(十六进制不是十进制)。但是还有很多其他的问题。你有 AT&T 语法倒退;缺少立即数上的 $ 前缀;你没有注册破坏者;等等。此外,这看起来像 gcc,它通常为 32 位或 64 位 x86 生成代码,但 BIOS 中断只能在 16 位实模式下工作。这应该是 MS-DOS 应用程序、引导加载程序、裸机应用程序还是什么?你打算如何编译和运行它?
  • 是的,我在这里有一些例子stackoverflow.com/questions/43668314/…。内联汇编很难做到正确,即使看起来很简单。如果您真的了解它,请使用内联汇编。 Code Project 上有一些教程很糟糕,它们结合了内联汇编和 16 位代码,并不是很好(而且有问题)的资源。
  • 但假设是此代码正在编写、编译和链接,以便在旧版 BIOS 中以实模式运行。它不会在保护模式或长模式下正常运行。

标签: c assembly interrupt cpu-registers


【解决方案1】:

我可以在内联汇编中使用中断吗?

是的,只要中断存在并且您通知编译器如何正确处理它(例如,“clobber list”告诉编译器哪些寄存器发生了变化等)。见the GCC manualhttps://stackoverflow.com/tags/inline-assembly/info

只要您使用正确的数字,您可能想要int $0x10 而不是int $10。而且您需要将立即数移动到寄存器中,而不是将寄存器移动到绝对内存地址。

如果这不起作用,我会怀疑您正在尝试使用 BIOS “视频服务”在屏幕上打印字符;但您不是在实模式下(并且使用 32 位代码或 64 位代码);并且 BIOS 可能根本不存在(例如 UEFI 系统);并且操作系统可能已经接管了对硬件的控制(并打破了 BIOS 期望的所有假设,例如在某些设备中禁用过时的“旧垃圾仿真”,重新配置内存、定时器和中断控制器;这样即使 BIOS 存在并且您'在实模式下你仍然不能安全地使用它)。

【讨论】:

  • 实际上,您可以从保护模式调用视频 BIOS。这就是 VESA 的工作原理。操作系统检测到指令是 int 10h 指令,转换到正确的 cpu 模式,让它运行,然后转换回来。尽管这些天在 x64 上它只是直接模拟 x86-16。但它不会运行,除非你是视频驱动程序.应用程序代码不能使用它。
  • @Joshua:所以你是说(对于一个未提及的操作系统上的一个极其受限的情况,它可能是由傻瓜编写的并且不能在不破坏视频驱动程序的情况下移植到 ARM 或 UEFI)你仍然不能使用BIOS int 0x10 from保护模式和操作系统需要模拟真实模式(和假的int 0x10)?
  • 不,我是说普通操作系统上的 VESA 视频驱动程序调用 int 10h。在 x86 上,在安装正确的视频驱动程序之前,您将使用 VESA 视频驱动程序。我阅读了有关 Linux 驱动程序如何工作的文档。 (您通常会使用芯片组驱动程序。当您将磁盘跳转到新硬件时,您会使用 VESA,直到您可以下载正确的驱动程序。)
  • @Brendan:您还需要使用正确的中断号。 10 是十进制,int $0xa,而不是 int $0x10。快速浏览一下,问题中的代码是为int 10h / AH=9 编写带有属性的字符设置参数。 en.wikipedia.org/wiki/INT_10H,但随后调用 int 0Ah
  • @PeterCordes:是的-我之前错过了(不确定是错字还是..)。
猜你喜欢
  • 2012-05-16
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2014-08-06
  • 2012-07-10
相关资源
最近更新 更多