news 2026/4/12 18:42:57

汇编语言全接触-80.CD-ROM出盒、入盒程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汇编语言全接触-80.CD-ROM出盒、入盒程序

概述:

我们在应用程序中常见到用软件控制 CD-ROM 的出、入盒,本文就是实现这种功能的一个例子。主要用到 INT 2FH 的 1510H(Send device driver request) 功能。具体参数详见程序注释。

要用到的几个中断说明如下:

1. IOCTL input 的格式:

偏移量

类型

内容

00H

字节

1AH

01H

字节

00H

02H

字节

03H

03H

字节

11 DUP(?)

0EH

双字

缓冲区地址

12H

缓冲区长度

14H

字节

6 DUP(?)

2. IOCTL output 的格式:

偏移量

类型

内容

00H

字节

1AH

01H

字节

00H

02H

字节

0CH

03H

字节

11 DUP(?)

0EH

双字

缓冲区地址

12H

缓冲区长度

14H

字节

6 DUP(?)

3. 在缓冲区中填入命令再用 INT 2fH 的 1510H 便可以实现 CD-ROM 的各种功能,缓冲的一些命令格式如下:

作用

长度

格式

出盒

1

00

解锁

2

01,00

加锁

2

01,01

入盒

1

05

取CD-ROM 状态

5

06,0,0,0,0

返回:06,xx,xx,0,0

xx,xx为状态字

位0:1 门开,0门关

位1:1未锁,0门锁

位B:1无盘,0有盘

4. 检测 CD-ROM 驱动程序的存在:

AX = 1500H

BX = 0

INT 2fH

返回:BX = CD-ROM 个数

CX = 起始CD-ROM 盘符,0=A:,1=B:等等

5. 发送 Device Driver Request:

AX = 1510H

ES:BX=请求头地址

CX = CD-ROM 的盘号

源程序如下:

; CD-ROM eject/load progrm

; Ver 1.20 ------ Jan 6,1996

CODE SEGMENT

ASSUME CS:CODE,DS:CODE

ORG 100H

START:

jmp install

COPYRIGHT DB 'CD-ROM drive eject/close prg. V1.20',0dh,0ah

DB 'Copyright (c) by Luo Yun Bin, Jan 6,1996',0dh,0ah

DB 'http://asm.yeah.net,Email: luoyunbin@telekbird.com.cn'

DB 0dh,0ah,0ah,24h

D_HELP DB 'Usage: EJ [drive:] [/?|/L|/U]',0dh,0ah

DB ' /? -------- Display this help',0dh,0ah

DB ' /L -------- Lock door',0dh,0ah

DB ' /U -------- Unlock door',0dh,0ah,24h

MESS_WAIT DB '[ENTER] to close, [Esc] to quit.',24h

MESS_ESC DB 'tray keep open...',0dh,0ah,24h

MESS_NO_CD DB 'MSCDEX not installed!',0dh,0ah,24h

MESS_STATUS DB 'There are '

DRV_NUMBER DB '0 CD-ROM drive(s) starting at '

DRV DB 'A:',0dh,0ah,24h

MESS_DRV DB 0dh,' ',0dh

DB 'drive '

DRV1 DB 'A: ',24h

MESS_EJECT DB 'ejecting....',24h

MESS_CLOSE DB 'closing ....',24h

MESS_LOCK DB 'locking ....',24h

MESS_UNLOCK DB 'unlocking...',24h

MESS_DONE DB ' Done!',0dh,0ah,24h

CD_DRV DW ?

FLAG DB ?

;======================================================

REQ_HEAD DB 1ah,0 ;IOCTL input

REQ_CMD DB 3

REQ_ERR DW ?

DB 9 dup (0)

BUF_OFF DW buffer

BUF_SEG DW ?

BUF_LEN DW ?

DB 6 dup (0)

;======================================================

BUFFER DB 5 dup (0) ;Max used 5 bytes

CMD_LINE PROC

mov si,81h ;处理命令行参数

mov di,80h

cld

cmd_reload:

lodsb

cmp al,0dh

jz conv_end ;将命令行小写字母换成大写

cmp al,'a'

jb conv_ok

cmp al,'z'

ja conv_ok

sub al,20h

conv_ok:

stosb

jmp short cmd_reload

conv_end:

xor al,al

stosb

mov si,80h

cmd_reload1:

lodsb

or al,al

jz cmd_end

cmp al,'/'

jz cmd_switch

cmp al,':'

jnz cmd_reload1

mov al,[si-2]

cmp al,'A'

jb cmd_end

cmp al,'Z'

ja cmd_end

sub al,'A'

xor ah,ah

mov cd_drv,ax

jmp short cmd_reload1

cmd_switch:

lodsb

cmp al,'?'

jz cmd_help

cmp al,'L'

jz cmd_lock

cmp al,'U'

jz cmd_unlock

jmp short cmd_reload1

cmd_end:

ret

cmd_help:

mov dx,offset d_help

call print

int 20h

cmd_lock:

or flag,1

jmp short cmd_reload1

cmd_unlock:

or flag,2

jmp short cmd_reload1

CMD_LINE ENDP

CD_INT PROC

mov ax,1510h

mov buf_seg,cs

mov bx,offset req_head

mov cx,cd_drv

int 2fh

ret

CD_INT ENDP

GET_STATUS PROC

mov buffer,6

mov buf_len,5

mov req_cmd,3

call cd_int

ret

GET_STATUS ENDP

EJECT_DISK PROC

mov dx,offset mess_drv

call print

mov dx,offset mess_eject

call print

mov buffer,0

mov buf_len,1

mov req_cmd,0ch

call cd_int

mov dx,offset mess_done

call print

ret

EJECT_DISK ENDP

CLOSE_TRAY PROC

mov dx,offset mess_drv

call print

mov dx,offset mess_close

call print

mov buffer,5

mov buf_len,1

mov req_cmd,0ch

call cd_int

mov dx,offset mess_done

call print

ret

CLOSE_TRAY ENDP

LOCK_DOOR PROC

mov dx,offset mess_drv

call print

mov dx,offset mess_lock

call print

mov word ptr buffer,0101h

mov buf_len,2

mov req_cmd,0ch

call cd_int

mov dx,offset mess_done

call print

ret

LOCK_DOOR ENDP

UNLOCK_DOOR PROC

mov dx,offset mess_drv

call print

mov dx,offset mess_unlock

call print

mov word ptr buffer,0001h

mov buf_len,2

mov req_cmd,0ch

call cd_int

mov dx,offset mess_done

call print

ret

UNLOCK_DOOR ENDP

CHECK_CDROM PROC

mov ax,1500h

xor bx,bx

int 2fh

or bx,bx ;BX = CD-ROM numbers

jnz mscdex_installed

mov dx,offset mess_no_cd

call print

int 20h

mscdex_installed:

mov bp,cx

xor bh,bh

add bp,bx

dec bp

cmp cd_drv,cx

jb re_set

cmp cd_drv,bp

jbe par_ok

re_set:

mov cd_drv,cx

par_ok:

add drv_number,bl

add drv,cl

mov cx,cd_drv

add drv1,cl

mov dx,offset mess_status

call print

ret

CHECK_CDROM ENDP

PRINT PROC

mov ah,9

int 21h

ret

PRINT ENDP

install:

mov dx,offset copyright

call print

call cmd_line

call check_cdrom ;检测 CD-ROM 状态

test flag,1 ;如果 /L 参数则 Lock_door

jz ins1

call lock_door

int 20h

ins1:

test flag,2 ;如果 /U 参数则 unlock_door

jz ins2

call unlock_door

int 20h

ins2:

call get_status

test word ptr buffer+1,1 ;如果现在在出盒状态则转入盒

jnz close_it

call eject_disk ;打开 CD-ROM

mov dx,offset mess_wait ;等待

call print

xor ax,ax

int 16h

cmp al,1bh

jz _esc_quit

close_it:

call close_tray ;关闭 CD-ROM

int 20h

_esc_quit:

mov dx,offset mess_drv

call print

mov dx,offset mess_esc

call print

int 20h

CODE ENDS

END START

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/18 4:04:48

LOL游戏界面个性化改造实战手册

LOL游戏界面个性化改造实战手册 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否厌倦了千篇一律的游戏界面?想要在召唤师峡谷中展现独特的个人风格?通过界面美化工具,我们可以轻松实现…

作者头像 李华
网站建设 2026/4/10 18:27:15

PDF-Extract-Kit部署指南:5分钟快速上手PDF智能提取

PDF-Extract-Kit部署指南:5分钟快速上手PDF智能提取 1. 引言 1.1 技术背景与应用场景 在科研、教育和办公场景中,PDF文档常包含大量结构化信息,如数学公式、表格、图文混排内容。传统手动提取方式效率低、易出错,尤其面对批量处…

作者头像 李华
网站建设 2026/4/12 7:11:26

PDF-Extract-Kit技术解析:数学公式识别背后的算法

PDF-Extract-Kit技术解析:数学公式识别背后的算法 1. 引言:PDF内容提取的技术挑战与创新 在学术研究、工程文档和出版领域,PDF格式因其版式固定、跨平台兼容性强而被广泛使用。然而,这种“视觉友好”的特性也带来了内容结构化提…

作者头像 李华
网站建设 2026/4/11 0:00:14

英雄联盟智能助手:5大功能模块深度解析与实战应用

英雄联盟智能助手:5大功能模块深度解析与实战应用 【免费下载链接】LeagueAkari ✨兴趣使然的,功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 还在为繁琐的…

作者头像 李华
网站建设 2026/4/8 10:44:02

PDF-Extract-Kit保姆级教程:解决中文PDF识别难题

PDF-Extract-Kit保姆级教程:解决中文PDF识别难题 1. 引言 在处理学术论文、技术文档或扫描件时,PDF文件中的文字、公式、表格等元素的提取一直是一个令人头疼的问题,尤其是面对复杂的中文排版和混合内容时。传统的OCR工具往往难以准确识别布…

作者头像 李华
网站建设 2026/4/8 1:26:01

springboot整合mybatis-plus(保姆教学) 及搭建项目

一、Spring整合MyBatis (1)将MyBatis的DataSource交给Spring IoC容器创建并管理,使用第三方数据库连接池(Druid,C3P0等)代替MyBatis内置的数据库连接池 (2)将MyBatis的SqlSessionFactory交给Spring IoC容器创建并管理,使用spring-mybatis整…

作者头像 李华