Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2011, 20:28   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Создание файла, ввод с клавиатуры

Доброго времени суток уважаемые эксперты. Вообщем возникла следущая проблема при попытке создания файла имя чье введено с клавиатуры.Читал в XView что последний символ строки устанавливается в 0DH и мол его нужно заменить нулем, ничего собственно с это не вышло, файл как не создавался
так и не создается. Вообще благодарен за любую помощь и за ранее спасибо

Код:
;Объявленый массив
bFileBuffer DB 255, 254 Dup (?)

; С метки начинаю вводить 
@IMPLEMENT_CREATE:
    Lea Dx, bFileBuffer
    CALL ReadFromKeyboard   
    CALL CreateFile

PROC ReadFromKeyboard
    Mov Ah, 0AH 
    INT 21H         
    RET
ENDP ReadFromKeyboard

PROC CreateFile    
    Lea Dx, bFileBuffer[2]
    Mov Si, Dx         
@LOOP_WHILE_NOT_EQUAL:
    Mov Al, BYTE PTR [Si]
    Cmp Al, 0DH
    JE @CHANGE
    Inc Si
    Jmp @LOOP_WHILE_NOT_EQUAL 
@CHANGE:
    Mov BYTE PTR [Si], 0   
    Lea Dx, Si                  
    Mov Ah, 3CH
    Mov Cx, 0 
    INT 21H
    RET
ENDP CreateFile
coNsept вне форума Ответить с цитированием
Старый 28.11.2011, 20:30   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Полный код программы
Код:
.186
.MODEL SMALL      
.STACK 200H 
.DATA 
 HANDLE DW 0 
 bArray DB 255, 254 Dup (0)   
 bFileBuffer DB 255, 254 Dup (0)   
 bFileNameStr DB 0     
 bEOF   DB 13, 10   
 bSPACE DB ' ', 0    
 bMSG_TITLE                           DB '[CMD]', 13, 10, 13, 10
 bMSG_TITLE_LEN = $ - bMSG_TITLE        
 bMSG_ERROR                           DB 13, 10, 'BAD COMMAND!'
 bMSG_ERROR_LEN = $ - bMSG_ERROR                                                               
 CMD_VERROR                           DB -1   
 CMD_VDEFAULT                         DB  0   
 CMD_VFCREATE                         DB  1
 CMD_VFOPEN                           DB  2  
 CMD_VFCLOSE                          DB  3   
 CMD_VFREAD                           DB  4     
 CMD_VFWRITE                          DB  5 
 CMD_VFRENAME                         DB  6
 CMD_VFCOPY                           DB  7
 CMD_VFPASTE                          DB  8    
 CMD_VFCUT                            DB  9  
 CMD_VFDELETE                         DB  10
 CMD_VTERMINATE                       DB  11 
 CMD_FCREATE                          DB 'fcreate'   
 CMD_FOPEN                            DB 'fopen'    
 CMD_FCLOSE                           DB 'fclose'   
 CMD_FREAD                            DB 'fread' 
 CMD_FWRITE                           DB 'fwrite'  
 CMD_FRENAME                          DB 'frename'
 CMD_FCOPY                            DB 'fcpy'
 CMD_FPASTE                           DB 'fpaste'
 CMD_FCUT                             DB 'fcut'  
 CMD_FDELETE                          DB 'fdel'
 CMD_TERMINATE                        DB 'terminate' 
                                                                             
.CODE  
    
PROC ReadFromKeyboard
    Mov Ah, 0AH 
    INT 21H         
    RET
ENDP ReadFromKeyboard

PROC OutputToScreen
    Mov Ah, 40H 
    Mov Bx, 1   
    INT 21H
    RET
ENDP OutputToScreen   

PROC GotoNewLine
    Lea Dx, bEOF
    Mov Cx, 2        
    CALL OutputToScreen
    RET
ENDP GotoNewLine  

PROC GetSpace
    Lea Dx, bSPACE
    Mov Cx, 1        
    CALL OutputToScreen
    RET
ENDP GetSpace    

PROC CreateFile    
    Lea Dx, bFileBuffer[3]
    Mov Si, Dx         
@LOOP_WHILE_NOT_EQUAL:
    Mov Al, BYTE PTR [Si]
    Cmp Al, 0DH
    JE @CHANGE
    Inc Si
    Jmp @LOOP_WHILE_NOT_EQUAL 
@CHANGE:
    Mov BYTE PTR [Si], 0   
    Lea Dx, Si                  
    Mov Ah, 3CH
    Mov Cx, 0 
    INT 21H
    RET
ENDP CreateFile
coNsept вне форума Ответить с цитированием
Старый 28.11.2011, 20:31   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Продолжение

Код:
PROC GetProcKey       
    CLD                     
    Lea Di, CMD_FCREATE     
    Lea Si, bArray[2]      
    Mov Cl, [bArray[1]]     
    Repe CmpSB              
    JNE @NEXT_CMD1          
    Xor Ax, Ax             
    Mov Al, CMD_VFCREATE     
    Mov [CMD_VDEFAULT], Al 
    RET
@NEXT_CMD1:    
    CLD                     
    Lea Di, CMD_FOPEN       
    Lea Si, bArray[2]      
    Mov Cl, [bArray[1]]     
    Repe CmpSB              
    JNE @NEXT_CMD2          
    Xor Ax, Ax             
    Mov Al, CMD_VFOPEN      
    Mov [CMD_VDEFAULT], Al 
    RET
@NEXT_CMD2:   
    CLD     
    Lea Di, CMD_FCLOSE
    Lea Si, bArray[2] 
    Mov Cl, [bArray[1]]
    Repe CmpSB 
    JNE @NEXT_CMD3  
    Xor Ax, Ax  
    Mov Al, CMD_VFCLOSE      
    Mov [CMD_VDEFAULT], Al   
    RET
@NEXT_CMD3:   
    CLD     
    Lea Di, CMD_FREAD
    Lea Si, bArray[2] 
    Mov Cl, [bArray[1]]
    Repe CmpSB 
    JNE @NEXT_CMD4  
    Xor Ax, Ax  
    Mov Al, CMD_VFREAD    
    Mov [CMD_VDEFAULT], Al   
    RET
@NEXT_CMD4:   
    CLD     
    Lea Di, CMD_FWRITE
    Lea Si, bArray[2] 
    Mov Cl, [bArray[1]]
    Repe CmpSB 
    JNE @NEXT_CMD5  
    Xor Ax, Ax  
    Mov Al, CMD_VFWRITE
    Mov [CMD_VDEFAULT], Al   
    RET
@NEXT_CMD5:   
    CLD     
    Lea Di, CMD_FRENAME
    Lea Si, bArray[2] 
    Mov Cl, [bArray[1]]
    Repe CmpSB 
    JNE @NEXT_CMD6  
    Xor Ax, Ax  
    Mov Al, CMD_VFRENAME
    Mov [CMD_VDEFAULT], Al   
    RET    
@NEXT_CMD6:   
    CLD     
    Lea Di, CMD_FRENAME
    Lea Si, bArray[2] 
    Mov Cl, [bArray[1]]
    Repe CmpSB 
    JNE @NEXT_CMD7  
    Xor Ax, Ax  
    Mov Al, CMD_VFRENAME
    Mov [CMD_VDEFAULT], Al   
    RET 
@NEXT_CMD7:   
    CLD     
    Lea Di, CMD_FCOPY
    Lea Si, bArray[2] 
    Mov Cl, [bArray[1]]
    Repe CmpSB 
    JNE @NEXT_CMD8  
    Xor Ax, Ax  
    Mov Al, CMD_VFCOPY
    Mov [CMD_VDEFAULT], Al   
    RET
@NEXT_CMD8:   
    CLD     
    Lea Di, CMD_FPASTE
    Lea Si, bArray[2] 
    Mov Cl, [bArray[1]]
    Repe CmpSB 
    JNE @NEXT_CMD9  
    Xor Ax, Ax  
    Mov Al, CMD_VFPASTE
    Mov [CMD_VDEFAULT], Al   
    RET
@NEXT_CMD9:   
    CLD     
    Lea Di, CMD_FCUT
    Lea Si, bArray[2] 
    Mov Cl, [bArray[1]]
    Repe CmpSB 
    JNE @NEXT_CMD10  
    Xor Ax, Ax  
    Mov Al, CMD_VFCUT
    Mov [CMD_VDEFAULT], Al   
    RET
@NEXT_CMD10:   
    CLD     
    Lea Di, CMD_TERMINATE
    Lea Si, bArray[2] 
    Mov Cl, [bArray[1]]
    Repe CmpSB 
    JNE @NEXT_CMD11  
    Xor Ax, Ax  
    Mov Al, CMD_VTERMINATE
    Mov [CMD_VDEFAULT], Al   
    RET  
@NEXT_CMD11:   
    CLD     
    Lea Di, CMD_FDELETE
    Lea Si, bArray[2] 
    Mov Cl, [bArray[1]]
    Repe CmpSB 
    JNE @NEXT_CMD12  
    Xor Ax, Ax  
    Mov Al, CMD_VFDELETE
    Mov [CMD_VDEFAULT], Al   
    RET  
@NEXT_CMD12:
    Xor Ax, Ax  
    Mov Al, CMD_VERROR
    Mov [CMD_VDEFAULT], Al                                           
    RET
ENDP GetProcKey 

PROC ExecCmd 
    Xor Ax, Ax
    Mov Al, [CMD_VDEFAULT] 
    
    Cmp Al, [CMD_VERROR]
    JE @IMPLEMENT_ERROR      
    
    Cmp Al, [CMD_VFCREATE]
    JE @IMPLEMENT_CREATE
      
    Cmp Al, [CMD_VFOPEN]
    JE @IMPLEMENT_FOPEN   

    Cmp Al, [CMD_VFCLOSE]
    JE @IMPLEMENT_CLOSE 
    
    Cmp Al, [CMD_VFREAD]
    JE @IMPLEMENT_READ
 
    Cmp Al, [CMD_VFWRITE]
    JE @IMPLEMENT_WRITE

    Cmp Al, [CMD_VFRENAME]
    JE @IMPLEMENT_RENAME

    Cmp Al, [CMD_VFCOPY]
    JE @IMPLEMENT_COPY
    
    Cmp Al, [CMD_VFPASTE]
    JE @IMPLEMENT_PASTE
    
    Cmp Al, [CMD_VFCUT]
    JE @IMPLEMENT_CUT

    Cmp Al, [CMD_VFDELETE]
    JE @IMPLEMENT_DELETE    
    
    Cmp Al, [CMD_VTERMINATE]
    JE @IMPLEMENT_TERMINATE
                                       
@IMPLEMENT_ERROR: 
    Lea Dx, bMSG_ERROR
    Mov Cx, bMSG_ERROR_LEN
    Call OutputToScreen 
    RET    
    
@IMPLEMENT_CREATE:
    CALL GetSpace  
    Lea Dx, bFileBuffer
    CALL ReadFromKeyboard   
    CALL CreateFile


@IMPLEMENT_FOPEN:

@IMPLEMENT_CLOSE:

@IMPLEMENT_READ:

@IMPLEMENT_WRITE:

@IMPLEMENT_RENAME:

@IMPLEMENT_COPY:

@IMPLEMENT_PASTE:

@IMPLEMENT_CUT:

@IMPLEMENT_DELETE: 

@IMPLEMENT_TERMINATE:
    RET
ENDP ExecCmd
  
EntryPoint:  

 Mov Ax, @DATA
 Mov Ds, Ax    
 Mov Es, Ax   
    
 Lea Dx, bMSG_TITLE     
 Mov Cx, bMSG_TITLE_LEN 
 CALL OutputToScreen    
 
@MainLoop:             
 Lea Dx, bArray       
 CALL ReadFromKeyboard      
 CALL GetProcKey  
 CALL ExecCmd  
 CALL GotoNewLine 
 JMP @MainLoop    
  
@Terminate:          
 Mov Ah, 01H
 INT 21H  
 Mov Ax, 4C00H
 INT 21H
End EntryPoint
coNsept вне форума Ответить с цитированием
Старый 28.11.2011, 20:48   #4
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

coNsept. Вот в таком роде.
Код:
.model tiny
.286
.code
org 100h
start:

mov ah,10
mov dx,offset buffer
int 21h

mov bx,word ptr buffer
shr bx,8
add bx,2
mov buffer[bx],0

mov ah,3ch
add dx,2
xor cx,cx
int 21h

mov bx,ax
mov ah,3eh
int 21h

ret
buffer db 255
end start

Последний раз редактировалось vadimych; 28.11.2011 в 22:39. Причина: Две строчки перепутал.
vadimych вне форума Ответить с цитированием
Старый 29.11.2011, 00:57   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Зачем мы двигаемя на 8 бит? Можно немного подробнее объяснить.
coNsept вне форума Ответить с цитированием
Старый 29.11.2011, 08:23   #6
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Первый байт буфера - заданный в коде максимальный размер, второй байт содержит число реально введённых символов. В регистр из памяти эти два байта помещаются в обратном порядке. И, сдвигая на 8 бит вправо bx, имеем в нём нужное значение.
vadimych вне форума Ответить с цитированием
Старый 29.11.2011, 17:18   #7
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Спасибо, теперь понятно что сдвигаемся ко второму байту.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ввод с клавиатуры Sparky Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 15.03.2020 14:34
ввод с клавиатуры Акоб Общие вопросы C/C++ 2 22.02.2011 18:00
Ввод с клавиатуры Von Общие вопросы C/C++ 6 22.10.2010 15:14