news 2026/4/23 14:40:09

汇编语言全接触-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/4/23 12:24:31

G-Helper:华硕ROG笔记本的轻量级性能优化神器

G-Helper:华硕ROG笔记本的轻量级性能优化神器 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: https…

作者头像 李华
网站建设 2026/4/23 12:23:36

超越基础:构建灵活、可调试的PyTorch训练循环深度解析

超越基础:构建灵活、可调试的PyTorch训练循环深度解析 引言 在深度学习项目开发中,PyTorch因其动态计算图和直观的编程范式而广受欢迎。然而,许多开发者在构建训练循环时仍停留在for epoch in range(num_epochs):的初级阶段,忽略了…

作者头像 李华
网站建设 2026/4/23 12:23:52

PDF-Extract-Kit质量评估:识别准确率量化指标

PDF-Extract-Kit质量评估:识别准确率量化指标 1. 引言 在数字化文档处理领域,PDF 文件因其格式稳定、跨平台兼容性强等特点被广泛使用。然而,PDF 中的内容往往以非结构化形式存在,尤其是包含复杂布局的学术论文、技术报告等文档…

作者头像 李华
网站建设 2026/4/23 12:16:23

springboot整合最新版minio和minio的安装(完整教程,新人必看)

概述:这种东西,多写点,方便以后自己使用 目录 第一步:docker安装配置minio 第一步:拉取镜像 第二步:创建用于存储MinIO数据的卷 如果是最新版minio直接就使用最后的那个命令创建容器 第三步&#xff…

作者头像 李华
网站建设 2026/4/23 13:54:41

PDF-Extract-Kit OCR实战:古籍文献文字识别方案

PDF-Extract-Kit OCR实战:古籍文献文字识别方案 1. 引言 1.1 古籍数字化的挑战与需求 古籍文献作为中华文化的重要载体,蕴含着丰富的历史、语言和科学信息。然而,由于年代久远、纸张老化、字迹模糊以及繁体字、异体字广泛使用,…

作者头像 李华
网站建设 2026/4/22 12:53:13

Kazumi完全攻略:打造专属番剧收藏库的终极秘籍

Kazumi完全攻略:打造专属番剧收藏库的终极秘籍 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP,支持流媒体在线观看,支持弹幕。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi 想要拥有一个完全个性化的番剧观看平台吗&a…

作者头像 李华