2017-07-11 12 views
2

ここは新しいです。 ファイル名を読み込み、 ".IN"で終わるかどうかを確認する必要があります。そうでない場合は、ファイルを開くために追加する必要があります。 ".IN" の助けを文字列を変更する(ファイル名拡張子)

GetFileName proc near 
    lea  bx,MsgEnterFilename 
    call printf_s ;It prints the string above 
    mov  ah,0ah 
    lea  dx,FileNameBuffer 
    mov  byte ptr FileNameBuffer,100 
    int  21h 
    lea  si,FileNameBuffer+2 
    lea  di,FileName 
    mov  cl,FileNameBuffer+1 
    mov  ch,0 
    mov  ax,ds 
    mov  es,ax 
    rep  movsb 
    mov  byte ptr es:[di],0 ;Puts a '\0' at the end 
    ret 
GetFileName endp 

fileNameInfo proc near ;Puts ".IN" and ".OUT" 
    lea  si, FileName 
    lea  di, FileNameCopy 
    mov  cx, MAXSTRING ; MAXSTRING is set to 256, yeah, I am copying beyond the string end 
    rep movsb 

    ; Search for ".IN" 
    mov  si, 0 

start_filename_length:     
    mov  al, FileNameCopy[si] 

    cmp  al, 0 
    je  end_filename_length 

    inc  FileNameLength 
    inc  FileNameLengthAux 

    add  si, 1 
    jmp  start_filename_length 
end_filename_length: 

    sub  FileNameLengthAux, 2 ; To begin the test in the last 3 bytes (".IN") 
    mov  si, word ptr FileNameLengthAux 
    cmp  FileNameCopy[si], "." 
    je  test_i 
    jmp  no_extension 
test_i: 
    inc  si 
    mov  si, word ptr FileNameLengthAux 
    cmp  FileNameCopy[si], "I" 
    je  test_n 
    cmp  FileNameCopy[si], "i" 
    je  test_n 
    jmp  no_extension 
test_n: 
    inc  si ; last byte 
    mov  si, word ptr FileNameLengthAux 
    cmp  FileNameCopy[si], "N" 
    je  correct_extension 
    cmp  FileNameCopy[si], "n" 
    je  correct_extension 
    ;jmp no_extension 

no_extensao: ;wrong extension counts as no extension 
    inc  FileNameLengthAux  ;goes to '\0' position 
    mov  si, word ptr FileNameLengthAux 
    mov  FileNameCopy[si], "." 
    inc  si 
    mov  FileNameCopy[si], "O" 
    inc  si 
    mov  FileNameCopy[si], "U" 
    inc  si 
    mov  FileNameCopy[si], "T" 
    inc  si 
    mov  FileNameCopy[si], 0 ;End the string 

    lea  si, FileNameCopy 
    lea  di, FileNameOut 
    mov  cx, MAXSTRING ; copy 256 bytes 
rep movsb 

    jmp  return_filename_info 

correct_extension: ;copyies till the "." 
    mov  bl, FileNameLengthAux 
    mov  FileNameLength, bl 
    sub  FileNameLength, 2 
    lea  si, FileNameCopy 
    lea  di, FileNameOut 
    mov  ch, 0 
    mov  cl, FileNameLengthAux 
rep movsb 
    mov  si, word ptr FileNameLengthAux ; it is on "." position 
    inc  si 
    mov  FileNameOut[si], "O" 
    inc  si 
    mov  FileNameOut[si], "U" 
    inc  si 
    mov  FileNameOut[si], "T" 
    inc  si 
    mov  FileNameOut[si], 0 ;End the string 
    ;jmp return_filename_info 

return_filename_info: 

    ret 
fileNameInfo endp 

感謝= D

+1

です:メインプログラムPSである... –

+0

私はMOV \tの「無効なオペランド」を取得しますString [si]、FileBuffer – Caiorrs

+0

(終了する前にコメントに入力してください) コードは正しいですか? – Caiorrs

答えて

1
sub  FileNameLengthAux, 2 ; To begin the test in the last 3 bytes (".IN") 
を交換し、その後、私は同じファイル名で、ファイルを作成する必要がありますが、 ".OUT" で終わります

これは有名なで、1つのエラーによるものです! を引く必要があります。
これを例で確認してください。ファイル名が "A.IN"の場合、長さは4になり、 "。"を探し始めるでしょう。オフセットの文字はSI=1です。数学でください:4 - = 1

test_i: 
    inc  si 
    mov  si, word ptr FileNameLengthAux 

は、なぜあなたはSIのための(正確に)インクリメントされた値を破壊するのですか?ここ

test_i: 
    inc  si 
    mov  si, word ptr FileNameLengthAux 

同じ問題。

mov  bl, FileNameLengthAux 
mov  FileNameLength, bl 
sub  FileNameLength, 2 

はどのようにこれが正しい最終のfileNameLengthを与えることを期待していますか?
FileNameLengthAuxはすでに元の長さ(2を引いたもの)よりも小さく、ここではさらに小さくなります(別の2を引いた値)。
正確にはの長さが返されます。


あなたのプログラムは、拡張子(「.IN」)を見つけられませんでした場合、あなたは全くのfileNameLengthを更新しません。 を追加してください。追加された ".OUT"の長さです。

+0

ねえ、あなたの考慮のおかげで、前にこれらの点のいくつかで考えなかったか、それとも注目していた= PIは何らかの修正を行って以来、私はあなたにそれを手伝ってほしいです https://pastebin.com/LM0Ep5wn – Caiorrs

+0

行間113-123生成された名前を印刷する必要がありますが、Copy and Outで空白になり、実行時に入力したものと同じになります – Caiorrs

+1

さらにこの回答の良いアドバイス、行517で、* FileNameLengthAux *から2を引く必要があります! –

0

呼び出しは申し訳ありませんが、コメントはあなたが問題を正確に何であるか明記していないポルトガル語

;Constants 
AscUpi    equ  "I" 
AscLowi    equ  "i" 
AscUpn    equ  "N" 
AscLown    equ  "n" 
AscUpo    equ  "O" 
AscLowo    equ  "o" 
AscUpu    equ  "U" 
AscLowu    equ  "u" 
AscUpt    equ  "T" 
AscLowt    equ  "t" 
AscDot    equ  "." 

call GetFileName 
call GetFileNameLength 
call VerifyFileName 
call GenFileNameOut 

VerifyFileName proc near 
    mov  dx, FileNameLength 
    mov  FileNameLengthAux, dx ; SI considera FileName[0] como sendo a 1a posição, como vetores em C 
    sub  FileNameLengthAux, 3 ;FileNameLength - 3 -> posição do . em ".IN" 
    mov  si, FileNameLengthAux ;"." 
    ;mov dx, "." 
    cmp  FileNameIn[si], AscDot 
    je  testa_i 
    jmp  no_extension 
testa_i: 
    inc  si ;FileNameLength - 2 -> posição do I em ".IN" ;"i" ou "I" 
    ;mov dx, "I" 
    cmp  FileNameIn[si], AscUpi 
    je  testa_n 
    ;mov dx, "i" 
    cmp  FileNameIn[si], AscLowi 
    je  testa_n 
    jmp  no_extension 
testa_n: 
    inc  si ;FileNameLength - 1 -> posição do N em ".IN" ;"n" ou "N" 
    ;mov dx, "N" 
    cmp  FileNameIn[si], AscUpn 
    je  right_extension 
    ;mov dx, "n" 
    cmp  FileNameIn[si], AscLown 
    je  right_extension 
    jmp  no_extension 
no_extension: ;Inclui extensao errada, caso seja entrado 123.abc, será transformado em 123.abc.in (.in são os últimos 3 caracteres) 
    mov  dx, FileNameLength 
    mov  FileNameLengthAux, dx 
    sub  FileNameLengthAux, 1 
    mov  si, FileNameLengthAux 
    inc  si 
    ;mov dx, "." 
    mov  byte ptr FileNameIn[si], AscDot 
    inc  FileNameLength ; Ajusta o FileNameLength somando os 3 caracteres que acabaram de ser adicionados 
    inc  si 
    ;mov dx, "I" 
    mov  byte ptr FileNameIn[si], AscUpi ; No PDF está especificado '.IN' 
    inc  FileNameLength ; Ajusta o FileNameLength somando os 3 caracteres que acabaram de ser adicionados 
    inc  si 
    ;mov dx, "N" 
    mov  byte ptr FileNameIn[si], AscUpn 
    inc  FileNameLength ; Ajusta o FileNameLength somando os 3 caracteres que acabaram de ser adicionados 
    inc  si 
    mov  FileNameIn[si], 0 ; Fecha a String do nome de arquivo 
    ;jmp right_extension 
right_extension: 
    ;FILENAMEIN ESTA CORRETO 
    ret 
VerifyFileName endp 
GenFileNameOut proc near 
    ;O nome do arquivo de entrada está correto agora, e o tamanho foi atualizado caso tenha sido necessário 
    ;Copiar o FileNameIn para FileNameOut e fazer os ajustes (.IN -> .OUT) 

    mov  cx, FileNameLength 
    lea  si, FileNameIn 
    lea  di, FileNameOut 
    rep  movsb ; Cópia de strings 

    ;agora FileNameOut = FileNameIn 

    mov  ax, FileNameLength 
    mov  FileNameLengthAux, ax 
    sub  FileNameLengthAux, 2 ; Vai para a posição do "I" em ".IN" 
    mov  si, FileNameLengthAux 
    mov  byte ptr FileNameOut[si], "O" ; Subtitui o 'I' por 'O' 
    inc  si 
    mov  byte ptr FileNameOut[si], "U" ; Subtitui o 'N' por 'U' 
    inc  si 
    mov  byte ptr FileNameOut[si], "T" ; Subtitui o 0 por 'T' 
    inc  si 
    mov  byte ptr FileNameOut[si], 0 ; Subtitui o 0 por 0 

    ;FILENAMEOUT ESTA CORRETO 
    ;call NewLine 
    ;lea bx, FileNameOut 
    ;call printf_s 

    ;FileNameOut está pronto 
    ;jmp return_filename_out 
return_filename_out: 
    ret 
GenFileNameOut endp 
GetFileNameLength proc near 
    mov  si, 0 ;primeira posicao da string 
inicio_filename_length: 
    mov  al, FileNameIn[si] 
    cmp  al, 0 
    je  fim_filename_length 
    inc  FileNameLength  
    inc  FileNameLengthAux ;Cópia de FileNameLength 
    inc  si 
    ;add si, 1 
    jmp  inicio_filename_length 
fim_filename_length: 
    ret 
GetFileNameLength endp 
+0

親切にしてください。 @Fifoernikがあなたを助けたとき、あなた自身の答えを受け入れることはあまりいいことではありません。完成したコードを見て、Fifoernikの答えの下にコメントを投稿します。 –

+0

申し訳ありませんが、解決策として回答する必要があると思っていました – Caiorrs

+1

実際には、正しい解決策をフォローアップすることをお勧めします。**しかし、このフォローアップは実際には*説明する必要があります。だから、単なるコードダンプでは答えが足りません。さらに、私はあなたが他のユーザーの答えから得た情報をうまく利用していることに気がつきました。だからあなたは彼の答えを受け入れるべきだったのです!今度は受諾のために2つのポイントがあることに気付きましたか? (自己回答を受け入れると** no ** points) –

関連する問題