📄 lastdrv2.asm
字号:
; LASTDRV2.ASM -- uses undocumented DOS
; this version fixes a misprint in the first and second printings of
; UNDOCUMENTED DOS, p. 45
assume cs:_TEXT, ds:_DATA, ss:_STACK
_STACK segment para stack 'STACK'
_STACK ends
_DATA segment word public 'DATA'
msg db 'LASTDRIVE='
dletter db (?)
db 0dh, 0ah, '$'
_DATA ends
_TEXT segment word public 'CODE'
public _lstdrv
_lstdrv proc far
push si
push bx
push cx
mov si, 1Bh ; assume DOS 3.0
mov ax, 3000h ; Get MS-DOS version number
int 21h ; major=AL, minor=AH
cmp al, 2
jl fail ; Requires DOS 2+
jne dos3up ; DOS 3+
mov si, 10h ; DOS 2.x
jmp short get
dos3up: cmp al, 3
jne ofs21
and ah, ah ; DOS 3.0
jz get
ofs21: mov si, 21h ; DOS 3.1+, DOS 4.x
get: mov ah, 52h ; Get List of Lists
xor bx, bx ; Zero out ES:BX so we can check
mov es, bx ; for NULL after INT 21h
int 21h ; list=ES:BX
mov cx, es
or cx, bx ; Is ES:BX NULL?
jz fail ; Function 52h not supported
mov al, byte ptr es:[bx+si]
xor ah, ah ; return LASTDRIVE in AX
jmp short leave
fail: xor ax, ax ; return 0 in AX
leave: pop cx
pop bx
pop si
ret
_lstdrv endp
main proc near
mov ax, _DATA
mov ds, ax
call _lstdrv
and ax, ax ; test for failure
jz done
mov bl, al ; save LASTDRIVE in BL
add al, ('A' - 1) ; convert LASTDRIVE to drive letter
mov dletter, al ; insert into string
mov ah, 9 ; Display String
mov dx, offset msg
int 21h
done: mov ah, 4Ch ; Return to DOS
mov al, bl ; exit code
int 21h
main endp
_TEXT ends
END main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -