在EMU8086改变工作目录DOS指令3 BH [英] Dos instruction 3Bh on emu8086 changing working directory

查看:229
本文介绍了在EMU8086改变工作目录DOS指令3 BH的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近开始学习上的说明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的唯一方法:是

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆