如何在Assembly中创建带输入字符串的文件夹?

时间:2016-10-17 08:12:37

标签: assembly x86-16

我是汇编语言的新手,如果我已经在变量中声明了路径,我可以创建一个文件夹,但在这种情况下我需要创建一个包含我输入的字符串的文件夹,但我不知道如何去做吧。输入字符串后,我总是得到“程序终止”。这是我的代码:

org 100h

jmp start

msg1: db "[C] Create folder", 0ah, 0dh
msg2 db "[X] Exit", 0ah, 0dh
msg3 db "Press the key of your choice: $", 0ah, 0dh
msg4: db "Type the folder name: "
dir1: db "$", 0

start:
    mov ax, cs
    mov dx, ax
    mov es, ax

    jmp menu

menu:
    mov ax, 03h
    int 10h

    mov dx, msg1
    mov ah, 09h
    int 21h

    mov ah, 01h
    int 21h

    cmp al, 43h
    je cFold

    cmp al, 78h
    je exit


cFold:
    mov ax, 03h
    int 10h

    mov dx, msg4
    mov ah, 09h
    int 21h

    mov dx, dir1
    mov ah, 0ah
    int 21h

    mov ah, 39h
    int 21h

exit:
    mov ah, 4ch
    int 21h     


ret

1 个答案:

答案 0 :(得分:0)

我将成为你的调试器,我的每小时只需500美元的低费率...绝不试图下载一些免费的调试器,我好多了,谢谢,我会在私信中发给你收据。

    jmp menu
menu:

在这里dada? :d

    cmp al, 43h
    je cFold

    cmp al, 78h
    je exit

cFold:

你可以将它们写成cmp al,'C'cmp al,'x'(除非你有一些非常愚蠢的汇编程序没有'' ASCII字符语法),以便更容易理解读者。您对流量控制的控制也不够控制......因此,除“x”之外的任何其他输入都会转到cFold标签和创建文件夹。

也许您想在上次测试后添加jmp menu之类的内容?

; dir1: db "$", 0
    mov dx, dir1
    mov ah, 0ah
    int 21h

这不是ah=0ah DOS服务的工作方式。你在哪里得到你的文件?扔掉它,寻找正确的(快速搜索引导我到这个one)。

实际上,你似乎不明白字符串是如何存储在内存中的。

让我告诉你你在记忆中所做的事情:

dir1: db "$", 0
start:
    mov ax, cs

编译成机器代码字节:24 00 8c c8('$',零和mov ax,cs指令)。其余的代码当然遵循......(如果你的汇编程序认为"$"字符串文字是nul-terminated,那么24 00可能编译成""本身,所以再添加一个零 - 检入调试器/反汇编程序或让汇编程序生成“list”文件)

现在阅读有关0A DOS服务的文档,它期望ds:dx中的输入缓冲区指针,缓冲区的结构是:

  1. 最大大小的一个字节(在您的情况下为'$',允许36个字符长输入)
  2. “最后一次输入的字符数...”的一个字节(在您的情况下为零)
  3. 缓冲区本身的最大字节数
  4. 您根本不提供缓冲区,而是提供mov ax,cs指令。

    因此,当用户输入:“c:\ very \ long \ path \ with \ many \ subdirectories \”时,它会严重覆盖其余代码,从DOS返回时会崩溃。

        mov ah, 39h
        int 21h
    

    这不是ah=39h DOS服务的工作方式。您必须提供ds:dx ASCIZ(ASCII零终止)字符串。

    如果要修复输入例程,则仍需要将旧值dir1调整为mov dx,dir1+2,以指向输入的第一个字符,而不是最大值。

    你必须对输入进行零终止,因此检查调试器从DOS返回的内容(如果在输入的字符末尾有CR / LF),你必须搜索那些并用0覆盖它们才能正确用于创建目录的输入(输入的长度由DOS在[dir1 + 1]字节中返回,因此“搜索”并不困难,并且长度与最后一个CR一起计算,因此可能覆盖(dir1+2)[length-1] = 0;会起作用)。

    总的来说,你应该做的最重要的事情现在找一些调试器并学习如何使用它 - 直到你可以找到上面描述的所有错误调试器并确认我是对的。

    此时返回编程并重新读取DOS int 21h文档并检查每个调用,如果您正确使用它。并修复所有问题并在调试器中验证修复程序。

    在没有调试器的情况下在汇编程序中进行编程就像组装一个被蒙住眼睛的机器人一样。