Assembly 用汇编语言弹出CD/光驱
这再简单不过了,但不是在犹豫 我有一个简单的代码,我用它来看看光盘驱动器是否会弹出 代码采用汇编语言,即英特尔nasm语法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位左右开始 谢谢,从驱动器
[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