我想在内联asm中使用中断,但它不允许我使用。我认为我的应用程序是这样的
__asm__("movb %ah,9;" "movb %al,0x41;" "movb %bh,0x0;" "movw %cx,0x1; " "movb %bl,0x0F ;" "int $10; ");
我运行后什么都没有得到,只是一个空白,我该怎么办?
rkue9o1l1#
我可以在内联汇编中使用中断吗?是的,只要中断存在,并且您通知编译器如何正确处理它(例如,“clobber list”告诉编译器哪些寄存器发生了变化,等等)。参见the GCC manual和https://stackoverflow.com/tags/inline-assembly/info只要你使用正确的数字,很可能你需要的是int $0x10而不是int $10,你需要的是将立即数移动到寄存器,而不是将寄存器移动到绝对内存地址。如果这样做不起作用,我会怀疑您试图使用BIOS的“视频服务”在屏幕上打印字符;但不是在真实的模式下(而且是在32位代码或64位代码中);并且BIOS可能根本不存在(例如,UEFI系统);并且OS可能已经接管了对硬件的控制(并且打破了BIOS期望的所有假设,像禁用某些设备中的过时的“遗留垃圾仿真”、重新配置存储器、以及定时器和中断控制器;因此即使BIOS存在并且您处于真实的模式,您仍然无法安全地使用它)。
int $0x10
int $10
1条答案
按热度按时间rkue9o1l1#
我可以在内联汇编中使用中断吗?
是的,只要中断存在,并且您通知编译器如何正确处理它(例如,“clobber list”告诉编译器哪些寄存器发生了变化,等等)。参见the GCC manual和https://stackoverflow.com/tags/inline-assembly/info
只要你使用正确的数字,很可能你需要的是
int $0x10
而不是int $10
,你需要的是将立即数移动到寄存器,而不是将寄存器移动到绝对内存地址。如果这样做不起作用,我会怀疑您试图使用BIOS的“视频服务”在屏幕上打印字符;但不是在真实的模式下(而且是在32位代码或64位代码中);并且BIOS可能根本不存在(例如,UEFI系统);并且OS可能已经接管了对硬件的控制(并且打破了BIOS期望的所有假设,像禁用某些设备中的过时的“遗留垃圾仿真”、重新配置存储器、以及定时器和中断控制器;因此即使BIOS存在并且您处于真实的模式,您仍然无法安全地使用它)。