在EMU8086改变工作目录DOS指令3 BH [英] Dos instruction 3Bh on emu8086 changing working directory
问题描述
我最近开始学习上的说明x8086指令和相当差。我试图用DOS功能3BH改变当前工作目录,然后创建一个名为使用39H目录TEST2文件夹中。无法理解的问题是什么或者是一个EMU8086问题。
.MODEL小,C.STACK。数据
CD分贝C:\\ test1的0DIR DBtest2的0。code
MOV AX,@数据
MOV DS,AX; MOV DX,抵消CD
MOV啊,3BH
INT 21H MOV DX,偏移DIR
MOV啊,39H
INT 21H MOV啊,4路
INT 21H
这是一个问题EMU8086:
1)C:驱动器是虚拟的,并映射到\\ EMU8086 \\ VDRIVE \\ C。我发现访问真正的C的唯一方法:是结 。 p>
2) INT 21H / AH = 39H
(MKDIR)需要一个完整的路径。
下面的示例虚拟驱动器和结对:
.MODEL SMALL.STACK。数据
CD分贝C:\\ test1的\\,0
DIR DBC:\\ test1的\\ TEST2,0
BUF DB 64 DUP('$')
errchdir DBERROR CHDIR $
errmkdir DBERROR MKDIR $
临时DW?。code
MOV AX,@数据
MOV DS,AX 电话show_drive
电话show_cwd MOV DX,抵消CD; DS:DX - > ASCIZ路径成为当前目录(最大64字节)
MOV啊,3BH; CHDIR - 设置当前目录
INT 21H
JC err_chdir
电话show_drive
电话show_cwd MOV DX,抵消DIR; DS:DX - > ASCIZ路径
MOV啊,39H; mkdir - 新建下创建子目录
INT 21H
JC err_mkdir MOV DX,抵消DIR; DS:DX - > ASCIZ路径成为当前目录
MOV啊,3BH; CHDIR - 设置当前目录
INT 21H
JC err_chdir
电话show_cwd MOV AX,4c00h
INT 21Herr_chdir:
MOV [临时],斧
MOV DX,OFFSET errchdir
MOV啊,09H
INT 21H
MOV AX,[临时]
MOV DL,人
或DL,30H
MOV啊,02
INT 21H
MOV AX,4c01h
INT 21H
err_mkdir:
MOV [临时],斧
MOV DX,OFFSET errmkdir
MOV啊,09H
INT 21H MOV AX,[临时]
MOV DL,人
或DL,30H
MOV啊,02
INT 21H MOV AX,4c02h
INT 21Hshow_drive:
MOV啊,19H;获取当前默认驱动器
INT 21H
MOV DL,人
添加DL,41H
MOV啊,02H
INT 21H
MOV dl时,':'
INT 21H 电话CRLF
RETshow_cwd:
MOV SI,OFFSET BUF
XOR DL,DL;实际的驱动器
MOV啊,47H; CWD - 获取当前目录
INT 21H MOV SI,OFFSET BUF;打印BUF,直到'\\ 0'
L1:
LODSB
测试人,人
JZ L2
MOV DL,人
MOV啊,02H
INT 21H
JMP L1 L2:
电话CRLF RETCRLF:
MOV啊,02H
MOV DL,13
INT 21H
MOV DL,10
INT 21H
RET
附录
当前目录的EMU8086该系统是一个越野车一塌糊涂。我建议只使用完整路径W / O驱动器。首先,当前目录已经从 C是切换\\ ... \\ EMU8086 \\ MyBuild \\
到 C:\\ ... \\ EMU8086 \\ VDRIVE \\
。结果
建立两个目录: C:\\ ... \\ EMU8086 \\ VDRIVE \\ C \\ TEST1
和 C:\\ ... \\ EMU8086 \\ VDRIVE \\ C \\ TEST1 \\ TEST2
(TEST1的子目录),并享受下面的例子:
.MODEL SMALL
.STACK。数据
ROOT DB.. \\,0
test1的分贝\\ TEST1 \\ test1.txt的0
test2的分贝\\ TEST1 \\ TEST2 \\的test2.txt,0
TEST3 DB\\ TEST1 \\ TEST3.TXT,0
DIR1 DB\\ TEST1 \\,0
DIR2 DB\\ TEST1 \\ TEST2 \\,0
DTA DB 128 DUP(?)
临时DW?
errcreate DBERROR CREATE $。code
主要PROC
MOV AX,@data
MOV DS,AX ;打破MyBuild的切换=当前目录\\ VDRIVE \\ C \\
MOV啊,3BH; CHDIR - 设置当前目录
MOV DX,OFFSET ROOT; DS:DX - > ASCIZ路径成为当前目录(最大64字节)
INT 21H;呼叫MS-DOS ;创建名为test1.txt
MOV啊,三通遥控; CREAT - 创建或截断文件
MOV DX,OFFSET TEST1; DS:DX - > ASCIZ文件名
XOR CX,CX;文件属性
INT 21H;呼叫MS-DOS
JC err_create
MOV啊,3EH; close - 关闭文件
MOV BX,AX;文件句柄
INT 21H;呼叫MS-DOS ;创建的test2.txt
MOV啊,三通遥控; CREAT - 创建或截断文件
MOV DX,OFFSET TEST2; DS:DX - > ASCIZ文件名
XOR CX,CX;文件属性
INT 21H;呼叫MS-DOS
JC err_create
MOV啊,3EH; close - 关闭文件
MOV BX,AX;文件句柄
INT 21H;呼叫MS-DOS ;创建test3.txt
MOV啊,三通遥控; CREAT - 创建或截断文件
MOV DX,OFFSET TEST3; DS:DX - > ASCIZ文件名
XOR CX,CX;文件属性
INT 21H;呼叫MS-DOS
JC err_create
MOV啊,3EH; close - 关闭文件
MOV BX,AX;文件句柄
INT 21H;呼叫MS-DOS ;显示第一个目录(C:\\ ... \\ EMU8086 \\ VDRIVE \\ C \\ TEST1)
MOV SI,OFFSET DIR1
电话show_dir
电话CRLF ;显示第二个目录(C:\\ ... \\ EMU8086 \\ VDRIVE \\ C \\ TEST1 \\ TEST2)
MOV SI,OFFSET DIR2
电话show_dir MOV AX,4c00h;返回0
INT 21H;呼叫MS-DOS
主要ENDPerr_create PROC
MOV [临时],斧头;错误code
MOV啊,09H;写入字符串到标准输出
MOV DX,OFFSET errcreate; DS:DX - > $ - 结尾的字符串
INT 21H;呼叫MS-DOS MOV AX,[临时]错误code
或人,30H;转换为ASCII
MOV啊,02;写入字符到标准输出
MOV DL,人;字符写
INT 21H;呼叫MS-DOS MOV AX,4c01h;返回1
INT 21H;呼叫MS-DOS
err_create ENDPshow_asciz PROC
L1:
LODSB
测试人,人;字符串的结尾?
JZ L2;是:循环结束
MOV啊,02H;写入字符到标准输出
MOV DL,人;字符写
INT 21H;呼叫MS-DOS
JMP L1;循环
L2:
RET
show_asciz ENDPshow_dir PROC; DS:SI指向完整路径
;使用FindFirst
MOV啊,1AH; SET磁盘传输区域地址
MOV DX,OFFSET DTA; DTA:磁盘传输区
INT 21H;呼叫MS-DOS MOV啊,4EH; FindFirst中 - 查找第一个匹配的文件
MOV DX,SI; DS:DX - > ASCIZ文件规范(包括路径和通配符)
XOR CX,CX;文件属性掩模
INT 21H;呼叫MS-DOS
JC完成
MOV SI,OFFSET DTA + 1EH; DS:SI指向找到的条目
电话show_asciz
电话CRLF ;找下一个
找下一个:
MOV啊,4FH;查找下一个匹配的文件
INT 21H;呼叫MS-DOS
JC完成
MOV SI,OFFSET DTA + 1EH; DS:SI指向找到的条目
电话show_asciz
电话CRLF
JMP FindNext中 完:
RET
show_dir ENDPCRLF PROC
MOV啊,02H;写入字符到标准输出
MOV DL,13;回车(CR)
INT 21H;呼叫MS-DOS
MOV分升,10;换行(LF)
INT 21H;呼叫MS-DOS
RET
CRLF ENDP
I have recently started learning x8086 instructions and knowledge on instructions is rather poor. I am trying to change the current working directory using dos function 3Bh and then create a folder named "test2" on the directory using 39h. Can't understand what the problem is or is it a emu8086 issue.
.MODEL SMALL,C
.STACK
.DATA
CD db "c:\test1",0
dir db "test2",0
.CODE
mov ax,@data
mov ds,ax;
mov dx,offset CD
mov ah,3Bh
int 21h
mov dx, offset dir
mov ah, 39h
int 21h
mov ah,4ch
int 21h
It's an emu8086 issue:
1) The C: drive is virtual and mapped to \emu8086\vdrive\C. The only way I found to access the real C: is a junction.
2) int 21h / AH=39h
(MKDIR) needs a full path.
Following example works on the virtual drive and a junction:
.MODEL SMALL
.STACK
.DATA
CD db "c:\test1\",0
dir db "c:\test1\test2",0
buf db 64 DUP ('$')
errchdir db "ERROR CHDIR $"
errmkdir db "ERROR MKDIR $"
temp dw ?
.CODE
mov ax,@data
mov ds,ax
call show_drive
call show_cwd
mov dx,offset CD ; DS:DX -> ASCIZ pathname to become current directory (max 64 bytes)
mov ah,3Bh ; CHDIR - SET CURRENT DIRECTORY
int 21h
jc err_chdir
call show_drive
call show_cwd
mov dx, offset dir ; DS:DX -> ASCIZ pathname
mov ah, 39h ; MKDIR - CREATE SUBDIRECTORY
int 21h
jc err_mkdir
mov dx,offset dir ; DS:DX -> ASCIZ pathname to become current directory
mov ah,3Bh ; CHDIR - SET CURRENT DIRECTORY
int 21h
jc err_chdir
call show_cwd
mov ax,4c00h
int 21h
err_chdir:
mov [temp], ax
mov dx, OFFSET errchdir
mov ah, 09h
int 21h
mov ax, [temp]
mov dl, al
or dl, 30h
mov ah, 02
int 21h
mov ax,4c01h
int 21h
err_mkdir:
mov [temp], ax
mov dx, OFFSET errmkdir
mov ah, 09h
int 21h
mov ax, [temp]
mov dl, al
or dl, 30h
mov ah, 02
int 21h
mov ax,4c02h
int 21h
show_drive:
mov ah, 19h ; GET CURRENT DEFAULT DRIVE
int 21h
mov dl, al
add dl, 41h
mov ah, 02h
int 21h
mov dl, ':'
int 21h
call crlf
ret
show_cwd:
mov si, OFFSET buf
xor dl, dl ; Actual drive
mov ah, 47h ; CWD - GET CURRENT DIRECTORY
int 21h
mov si, OFFSET buf ; Print buf until '\0'
L1:
lodsb
test al, al
jz L2
mov dl, al
mov ah, 02h
int 21h
jmp L1
L2:
call crlf
ret
crlf:
mov ah, 02h
mov dl, 13
int 21h
mov dl, 10
int 21h
ret
Addendum
The system of "current directory" in emu8086 is a buggy mess. I suggest to use only full paths w/o drive. First the current directory have to be switched from c.\...\emu8086\MyBuild\
to C:\...\emu8086\vdrive\
.
Construct two directories: C:\...\emu8086\vdrive\C\TEST1
and C:\...\emu8086\vdrive\C\TEST1\TEST2
(subdirectory of TEST1) and "enjoy" following example:
.MODEL SMALL
.STACK
.DATA
ROOT db "..\",0
test1 db "\TEST1\TEST1.TXT", 0
test2 db "\TEST1\TEST2\TEST2.TXT", 0
test3 db "\TEST1\TEST3.TXT", 0
DIR1 db "\TEST1\",0
DIR2 db "\TEST1\TEST2\",0
dta db 128 DUP(?)
temp dw ?
errcreate db "ERROR CREATE $"
.CODE
main PROC
mov ax, @data
mov ds, ax
; break out of "MyBuild" = switch current directory to "\vdrive\C\"
mov ah, 3Bh ; CHDIR - SET CURRENT DIRECTORY
mov dx, OFFSET ROOT ; DS:DX -> ASCIZ pathname to become current directory (max 64 bytes)
int 21h ; Call MS-DOS
; create test1.txt
mov ah, 3Ch ; CREAT - CREATE OR TRUNCATE FILE
mov dx, OFFSET test1 ; DS:DX -> ASCIZ filename
xor cx, cx ; File attributes
int 21h ; Call MS-DOS
jc err_create
mov ah, 3Eh ; CLOSE - CLOSE FILE
mov bx, ax ; File handle
int 21h ; Call MS-DOS
; create test2.txt
mov ah, 3Ch ; CREAT - CREATE OR TRUNCATE FILE
mov dx, OFFSET test2 ; DS:DX -> ASCIZ filename
xor cx, cx ; File attributes
int 21h ; Call MS-DOS
jc err_create
mov ah, 3Eh ; CLOSE - CLOSE FILE
mov bx, ax ; File handle
int 21h ; Call MS-DOS
; create test3.txt
mov ah, 3Ch ; CREAT - CREATE OR TRUNCATE FILE
mov dx, OFFSET test3 ; DS:DX -> ASCIZ filename
xor cx, cx ; File attributes
int 21h ; Call MS-DOS
jc err_create
mov ah, 3Eh ; CLOSE - CLOSE FILE
mov bx, ax ; File handle
int 21h ; Call MS-DOS
; show first directory (C:\...\emu8086\vdrive\C\TEST1)
mov si, OFFSET DIR1
call show_dir
call crlf
; show second directory (C:\...\emu8086\vdrive\C\TEST1\TEST2)
mov si, OFFSET DIR2
call show_dir
mov ax,4c00h ; return 0
int 21h ; Call MS-DOS
main ENDP
err_create PROC
mov [temp], ax ; Error code
mov ah, 09h ; WRITE STRING TO STANDARD OUTPUT
mov dx, OFFSET errcreate ; DS:DX -> '$'-terminated string
int 21h ; Call MS-DOS
mov ax, [temp] ; Error code
or al, 30h ; Convert to ASCII
mov ah, 02 ; WRITE CHARACTER TO STANDARD OUTPUT
mov dl, al ; character to write
int 21h ; Call MS-DOS
mov ax,4c01h ; return 1
int 21h ; Call MS-DOS
err_create ENDP
show_asciz PROC
L1:
lodsb
test al, al ; End of string?
jz L2 ; Yes: end of loop
mov ah, 02h ; WRITE CHARACTER TO STANDARD OUTPUT
mov dl, al ; character to write
int 21h ; Call MS-DOS
jmp L1 ; loop
L2:
ret
show_asciz ENDP
show_dir PROC ; DS:SI pointer to full path
; findfirst
mov ah, 1AH ; SET DISK TRANSFER AREA ADDRESS
mov dx, OFFSET dta ; dta: disk transfer area
int 21h ; Call MS-DOS
mov ah, 4Eh ; FINDFIRST - FIND FIRST MATCHING FILE
mov dx, si ; DS:DX -> ASCIZ file specification (may include path and wildcards)
xor cx, cx ; File attribute mask
int 21h ; Call MS-DOS
jc Finish
mov si, OFFSET dta + 1Eh ; DS:SI pointer to found entry
call show_asciz
call crlf
; findnext
findnext:
mov ah, 4FH ; FIND NEXT MATCHING FILE
int 21h ; Call MS-DOS
jc Finish
mov si, OFFSET dta + 1Eh ; DS:SI pointer to found entry
call show_asciz
call crlf
jmp findnext
Finish:
ret
show_dir ENDP
crlf PROC
mov ah, 02h ; WRITE CHARACTER TO STANDARD OUTPUT
mov dl, 13 ; Carriage return (CR)
int 21h ; Call MS-DOS
mov dl, 10 ; Line feed (LF)
int 21h ; Call MS-DOS
ret
crlf ENDP
这篇关于在EMU8086改变工作目录DOS指令3 BH的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!