emu8086 上的 Dos 指令 3Bh 更改工作目录

2023-12-03

我最近开始学习x8086指令,对指令的了解比较少。我试图使用 dos 函数 3Bh 更改当前工作目录,然后使用 39h 在该目录上创建一个名为“test2”的文件夹。不明白问题是什么,还是 emu8086 的问题。

      .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

这是一个 emu8086 问题:

1)C:驱动器是虚拟的,映射到\emu8086\vdrive\C。我发现访问真正的 C: 的唯一方法是junction.

2) int 21h / AH=39h(MKDIR) 需要完整路径。

以下示例适用于虚拟驱动器和联结:

.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

emu8086中的“当前目录”系统是一团乱七八糟的错误。我建议仅使用不带驱动器的完整路径。首先必须切换当前目录c.\...\emu8086\MyBuild\ to C:\...\emu8086\vdrive\.
构建两个目录:C:\...\emu8086\vdrive\C\TEST1 and C:\...\emu8086\vdrive\C\TEST1\TEST2(TEST1 的子目录)并“享受”以下示例:

.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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

emu8086 上的 Dos 指令 3Bh 更改工作目录 的相关文章

  • 汇编指令陷阱有什么作用?

    当程序需要时 程序通常会发出软件陷阱 由操作系统提供服务 通用异常处理程序 操作系统确定陷阱的原因并做出响应 适当地 汇编指令 trap 和 BASIC 中的 TRAP 指令一样吗 答案似乎是肯定的 你能接受还是拒绝我的结论 不中断 的代码
  • 遍历内存编辑每个字节

    我正在编写汇编代码 提示用户输入一串小写字符 然后输出包含所有大写字符的相同字符串 我的想法是迭代从特定地址开始的字节 并从每个字节中减去 20H 将小写变为大写 直到到达具有特定值的字节 我对 Assembly 相当缺乏经验 所以我不确定
  • 这段汇编语言代码是什么意思?

    我是一名学生 刚刚开始学习汇编语言 为了更好地理解它 我只是用 C 写了一个简短的代码并将其转换为汇编语言 奇怪的是我有点听不懂 代码是 include
  • 即使我确实为变量设置了初始值,数据段也没有被初始化

    我已经编写了一个代码 该代码应该生成某种数字列表 但是即使我为它们分配了初始值 我的数据段变量也没有被初始化 This is how DS 0000 looks when I run it 这是我的代码 但数据段只保留垃圾值 MODEL s
  • 汇编-符号标志和奇偶校验标志

    我不明白什么时候设置标志标志 什么时候设置奇偶校验 据我所知 符号标志表示运算结果的符号 0表示正数 1表示负数 那么为什么在下一个代码中 mov al 5 sub al 124 SF为零 结果是负数 关于PF 为什么a和b中设置了PF a
  • 为什么不能执行 mov [eax], [ebx] [重复]

    这个问题在这里已经有答案了 我可以做这个 mov eax ebx 和这个 mov eax ebx 甚至这个 mov eax ebx 但不是这个 错误C2415 mov eax ebx 只是wtf 为什么 它与 ptr1 ptr2 相同 为什
  • 如何在汇编语言中换行打印多个字符串

    我试图在汇编中的不同行上打印多个字符串 但使用我的代码 它只打印最后一个字符串 我对汇编语言非常陌生 所以请耐心等待 section text global start start mov edx len mov edx len1 mov
  • CALL指令是否总是将EIP指向的地址压入堆栈?

    x86架构中函数调用时是否存在返回地址不入栈的情况 No CALL根据定义 将在跳转到目标地址之前将返回地址压入堆栈 该返回地址是EIP or RIP sizeof call instruction 通常为 5 个字节 英特尔 64 和 I
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 汇编8086监听键盘中断

    我有与此完全相同的问题 边画边听键盘 https stackoverflow com questions 13970325 8086 listen to keyboard while drawing 但第一个答案 接受的答案 只听键盘一次
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • 寄存器寻址模式与直接寻址模式

    我在试卷中遇到过这个问题 它指出 哪种给定的寻址模式更快 为什么 寄存器寻址方式 直接寻址方式 现在根据我的说法 寄存器寻址模式应该更快 因为寄存器是计算机中最快的存储位置 这是正确答案吗 请帮忙 谢谢 两种寻址模式之间的区别是 地址的来源
  • 为什么我的空循环在 Intel Skylake CPU 上作为函数调用时运行速度是原来的两倍?

    我正在运行一些测试来比较 C 和 Java 并遇到了一些有趣的事情 在 main 调用的函数中 而不是在 main 本身中 运行具有优化级别 1 O1 的完全相同的基准代码 导致性能大约翻倍 我正在打印 test t 的大小 以毫无疑问地验
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会
  • Linux内核页表更新

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地

随机推荐

  • 验证视图状态 MAC 失败错误

    尝试通过传递参数来运行报表查看器 但收到错误 验证视图状态 MAC 失败错误 ASP NET MVC 已尝试以下但没有运气 添加了机器密钥 http aspnetresources com tools machineKey 到 web co
  • Hyperledger Fabric 加密材料

    如果我们看到加密配置文件夹中基础网络 of 布料样品 我们有各种类型的各种证书材料 example com ca 0d46ccf0e9436c1bc3b6e2bf80cdb202c4943604f95c72ee0ff839d3ec30071
  • 由于名称中存在撇号而导致无效的 XPath 表达式异常

    我收到以下代码的无效 Xpath 异常 current Name current Name replace System out println current Name String xp1 page name current Name
  • 在 web.config 文件中设置重定向

    我正在尝试使用更具描述性的 URL 来重定向一些不友好的 URL 这些 URL 结尾为 aspx cid 3916每个类别名称页面的最后一位数字都不同 我希望它重定向到Category CategoryName 3916 我在web con
  • Android:如何创建“持续”通知?

    您好 我如何创建像第一个电池指示器一样的永久通知 如果您正在使用NotificationCompat Builder 您可以使用 NotificationCompat Builder mBuilder new NotificationCom
  • 从本地 html/javascript 网站发布到在线 PHP 文件

    我正在尝试做什么 从本地 html javascript 网站发布到在线 PHP 文件 Problem 当我尝试使用下面的代码时 我不断收到下面提到的错误 背景 该网站旨在本地运行 由于每个用户都可以选择使用哪个浏览器 因此我希望找到一种可
  • 将自定义计算添加到 magento 中的购物车总计和总计

    我正在网站上工作 我想在购物车总额和总计中添加 减去费用 我正在触发此事件以捕获购物车详细信息 sales order save after 在观察者中我使用此代码获得了价格 public function modifyPrice Vari
  • 使用 awk 或 sed 基于公共列合并两个 csv 文件 [重复]

    这个问题在这里已经有答案了 我有一个两个 CSV 文件 两个文件中有一个公共列 并且一个文件中有重复项 如何使用 awk 或 sed 合并两个 csv 文件 CSV 文件 1 5 1 20 user mark Type1 445566 5
  • 如何为for循环中除最后一项之外的每一项添加分隔符

    在下面的循环中 如何从循环中的latt键中删除逗号 var result These are the results jQuery each item keyterms terms function i kw for key in keyw
  • 访问 wpf c# 应用程序中其他类中 XAML 的按钮和复选框的值

    我正在开发 WPF Kinect 项目 它是 Windows Kinect 的开发人员工具包示例之一 称为 Kinect Explorer 您可以从 Kinect 开发者工具包 SDK 1 5 版下载它 在 kinectwindow xam
  • Angular:使用 Renderer2 添加 CSS 变量

    是否可以使用添加内联样式CSS变量Renderer2 我尝试了以下方法 但它不起作用 import Component OnChanges Output ViewChild Renderer2 ElementRef ViewEncapsul
  • Node CLI 工具评估字符串

    有没有办法使用 NodeJS CLI 工具来评估一串 Javascript 代码 例如 使用 Perl 将会是perl e code 使用Pythonpython c code 与红宝石ruby e code 并且使用 PHP php r
  • width:auto 对于 字段

    CSS新手问题 我想width auto for a display block元素的意思是 填充可用空间 然而对于一个
  • 从数据属性将字符串解析为对象[重复]

    这个问题在这里已经有答案了 我在使用 jQuery 验证插件时遇到了很多麻烦 解决这个问题的唯一方法是使用 submitHandler属性并在其中做一些技巧 其中检查触发器的父级是否是字段集以及是否有data submit handler属
  • Android布局文件夹可以包含子文件夹吗?

    现在 我将每个 XML 布局文件存储在 res layout 文件夹中 因此管理小型项目是可行且简单的 但是当存在大型且繁重的项目时 则应该有一个层次结构和布局文件夹内需要的子文件夹 for e g layout layout person
  • 意外的括号“[” - PHP [重复]

    这个问题在这里已经有答案了 我正在为我的小应用程序团队的 Java 代码编写一个小型存储库 但我的代码中到处都是这个错误 base explode class 0 仅此问题出现one每次都一行代码 据我所知 上面是正确的PHP语法 那么这是
  • 使用 SentiWordNet 获取不正确的分数

    我正在使用 SentiWordNet 进行一些情感分析 我参考了这里的帖子如何使用 SentiWordNet 然而 尽管尝试了各种输入 我还是得到了 0 0 分 我在这里做错了什么吗 谢谢 import java io BufferedRe
  • 使用 Boost 库的 CMake Windows 10 库未正确找到

    像许多其他人一样 我在 Windows 上使用 boost 库时遇到问题 在 Ubuntu 16 04 上 它与 libboost all dev 配合得很好 但在 Windows 上我遇到了很多问题 我尝试构建一个 cryptonote
  • 用于子集索引搜索的数据结构

    我正在研究一个时间 2019 03 17 标签 c jqueryimplementation我正在尝试找出一种有效的算法来在整个 DOM 的子集中定位元素 例如子选择器 目前 我正在构建 DOM 时创建常用选择器的索引 class id 和
  • emu8086 上的 Dos 指令 3Bh 更改工作目录

    我最近开始学习x8086指令 对指令的了解比较少 我试图使用 dos 函数 3Bh 更改当前工作目录 然后使用 39h 在该目录上创建一个名为 test2 的文件夹 不明白问题是什么 还是 emu8086 的问题 MODEL SMALL C