Assembly 用汇编语言弹出CD/光驱

Assembly 用汇编语言弹出CD/光驱,assembly,x86,nasm,Assembly,X86,Nasm,这再简单不过了,但不是在犹豫 我有一个简单的代码,我用它来看看光盘驱动器是否会弹出 代码采用汇编语言,即英特尔nasm语法 [BITS 16] [ORG 0X07C00] STI Eject: mov ah, 46h mov al, 00h mov dl, 00h int 13h endprogram: times 510-($-$$) db 0 db 0x55 db 0xAA 我可以简单地增加驱动器号,但如果驱动器为0,这难道不能正常工作吗?驱动器可能在128位左右开始 谢谢,从驱动器

这再简单不过了,但不是在犹豫

我有一个简单的代码,我用它来看看光盘驱动器是否会弹出

代码采用汇编语言,即英特尔nasm语法

[BITS 16]
[ORG 0X07C00]
STI

Eject:

mov ah, 46h
mov al, 00h
mov dl, 00h
int 13h

endprogram:
times 510-($-$$) db 0
db 0x55
db 0xAA
我可以简单地增加驱动器号,但如果驱动器为0,这难道不能正常工作吗?驱动器可能在128位左右开始


谢谢,

从驱动器中弹出CD时,似乎没有任何标准化的BIOS中断。所以,基本上,如果你想要这个功能,你有很多工作要做。您需要编写ATA驱动程序并发送原始命令以强制CD驱动器弹出

这比听起来要复杂得多。您必须检测ATA驱动器,将其过滤到CD驱动器,然后发送命令


您需要查看OSDev及其

函数48h以获取驱动器参数。看看你得到了什么。很可能是不同的驱动器号。或者,对于特定BIOS中的驱动器类型,此扩展功能可能不可用/不受支持。

您可以尝试发布以下代码:

或者(这曾经是内置示例之一)


你当然知道这个程序只能在纯DOS或类似的环境下运行(Win95等)。@drhirsch:看起来像一个引导程序sector@drhirsch…不,我不知道。我不断听说有人在DOS中运行ASM代码,但我没有意识到DOS是必需的。这真是一个大问题。。简单地说,我正在进行3年多的过程来创建一个操作系统。该代码现在已经过时,可能是BIOS加载的一系列程序的一部分。上面的程序模拟了BIOS加载后操作系统的工作方式。但是,我知道DOS是必需的。但是,您所说的“在纯DOS或类似操作系统下运行”到底是什么意思?我可以使用一些中断来打印到屏幕上。如果你阅读了OP开发自己操作系统时的评论,那么他没有使用windows
.386
.MODEL FLAT,STDCALL
OPTION CASEMAP:NONE

INCLUDE windows.inc

INCLUDE kernel32.inc
INCLUDE winmm.inc
INCLUDE masm32.inc

INCLUDE c:\masm32\macros\macros.asm

INCLUDELIB kernel32.lib
INCLUDELIB winmm.lib
INCLUDELIB masm32.lib

.DATA

   szDriveLetter BYTE "R:", 0

.DATA?

   szBuffer      BYTE 256 DUP(?)

.CODE

start:

 ; to close
   INVOKE lstrcat, ADDR szBuffer, SADD("open ")
   INVOKE lstrcat, ADDR szBuffer, ADDR szDriveLetter
   INVOKE lstrcat, ADDR szBuffer, SADD(" type cdaudio alias CDName")
   INVOKE mciSendString, ADDR szBuffer, NULL, 0, 0
   .IF eax != 0
       push eax
       INVOKE StdOut, SADD("Error",13,10)
       pop eax
       jmp done
   .ENDIF
   INVOKE mciSendString, SADD("set CDName door closed"), NULL, 0, 0
   .IF eax != 0
       push eax
       INVOKE StdOut, SADD("Error",13,10)
       pop eax
       jmp done
   .ENDIF    
   INVOKE mciSendString, SADD("close CDName"), NULL, 0, 0                          
   .IF eax != 0
       push eax
       INVOKE StdOut, SADD("Error",13,10)
       pop eax
       jmp done
   .ENDIF  

   mov eax, 0

 done:  

   INVOKE ExitProcess, eax

END start 
; Beer - example of tiny (one section) Win32 program

format PE GUI 4.0

include 'win32a.inc'

; no section defined - fasm will automatically create .flat section for both
; code and data, and set entry point at the beginning of this section

invoke MessageBoxA,0,_message,_caption,MB_ICONQUESTION+MB_YESNO
cmp eax,IDYES
jne exit

invoke mciSendString,_cmd_open,0,0,0
invoke mciSendString,_cmd_eject,0,0,0
invoke mciSendString,_cmd_close,0,0,0

exit:
invoke ExitProcess,0

_message db 'Do you need additional place for the beer?',0
_caption db 'Desktop configuration',0

_cmd_open db 'open cdaudio',0
_cmd_eject db 'set cdaudio door open',0
_cmd_close db 'close cdaudio',0

; import data in the same section

data import

library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
winmm,'WINMM.DLL'

import kernel32,\
ExitProcess,'ExitProcess'

import user32,\
MessageBoxA,'MessageBoxA'

import winmm,\
mciSendString,'mciSendStringA'

end data