2015-11-02 7 views
3

У моей программы есть цель: прочитать символы из командной строки и использовать их в качестве полного имени пути в другой каталог. Эта программа работает, если вместо ввода символов из командной строки я определяю буфер как «P: \ test \», поэтому проблема заключается в символах чтения. Тем не менее, я попытался распечатать свой буфер, используя: ah 02h int 21h (одиночный символ), и он вывел его правильно.Чтение символов из командной строки и использование их для имени пути в сборке 8086

.model small 
.stack 100h 
.data 
dir db 255 dup (0) 
.code 
start: 
mov dx, @data 
mov ds, dx 

xor cx, cx 
mov cl, es:[80h] 
mov si, 0082h ;reading from command prompt 0082h because first one is space 
xor bx, bx 

l1: 
mov al, es:[si+bx]   ;filling buffer 
mov ds:[dir+bx], al 
inc bx 
loop l1 

mov dx, offset dir   ;going to directory 
mov ah, 3Bh 
int 21h 

mov ah, 4ch 
mov al, 0 
int 21h 
end start 

ответ

2

В конце командной строки находится всегда 0Dh. Таким образом, значение в es:[80h] (количество символов в командной строке) слишком велико. Кроме того, конец пути должен быть аннулирован для Int 21h/AH=3Bh («ASCIZ» означает: символы ASCII плюс ноль).

Это один должен работать:

.model small 
.stack 1000h     ; Don't skimp on stack. 

.data 
    dir db 255 dup (0) 

.code 
start: 

    mov dx, @data 
    mov ds, dx 

    xor cx, cx 
    mov cl, es:[80h] 
    dec cl      ; Without the last character (0Dh) 
    mov si, 0082h    ; reading from command prompt 0082h because first one is space 
    xor bx, bx 

    l1: 
    mov al, es:[si+bx]   ; filling buffer 
    mov ds:[dir+bx], al 
    inc bx 
    loop l1 

    mov byte ptr [dir+bx], 0 ; Terminator 

    mov dx, offset dir   ; going to directory 
    mov ah, 3Bh 
    int 21h 

    mov ax, 4C00h    ; Exit with 0 
    int 21h 

end start 

Считаете ли вы, что вы не можете изменить букву диска с Int 21h/AH=3Bh?

+0

Таким образом, проблема заключалась в том, что мое имя пути состояло из «возврата каретки» на конце? Во-вторых, «mov byte ptr [dir + bx], 0« Я думал, что весь мой буфер «dir» заполнен 0, кроме ввода командной строки? Значит, эта линия не является сущностной? Да, я знаю, что я не могу изменить букву диска с этим прерыванием. – Pijus

+0

@Pijus: Объявление 1: Да. Объявление 2: Да. Быть в безопасности. – rkhb

+0

Кстати, нужно использовать fill (0) или можно использовать ('$')? Не только в этом случае, для ex в получении текущего каталога. – Pijus