Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Лунный пёс
0 / 0 / 0
Регистрация: 23.12.2009
Сообщений: 12
1

Получить размер файла, заданного в командной строке

26.10.2011, 20:28. Просмотров 2816. Ответов 2
Метки нет (Все метки)

Помогите найти ошибку! дано задание получить размер файла заданного в командной строке функциями DOS. при попытке компиляции говорит что не хватает места под программу. хотя это наверняка не единственная проблема этой программы)) ассемблер понимаю через пень колоду, код рождаю в мучениях) помогите кто чем может))

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
.286
PROGRAM    segment
           assume  CS:PROGRAM
           org     100h
 
Start:     jmp     InitProc
    
msHelp     db      10,13, 'Вы можете указать имя файла$'
msDiag     db      10,13, 'Введите путь к файлу:$'
msErr      db      10,13, 'Ошибка: проверьте имя или доступность файла $'
msOK       db      10,13, 'Размер файла$'
mss        db             'Узнается размер$'
 
FName      db      253,?,255 dup(?)
HANDLE     db      ? 
FSIZE_HIGH db      ?
FSIZE_LOW  db      ?
 
; Вывод сообщения из DX на экран
WriteCons  proc 
           push    ax
           mov     ah,09h
           int     21h
           pop     ax
           ret
WriteCons  endp
 
RCLine     proc
           xor     bx,bx
           mov     si,80h          ;SI=смещение командной строки.
           lodsb                   ;Получим кол-во символов.
           cmp     al,0
           je      Fl
           inc     si              ;SI указывает на 1ый символ строки.
Next_char: lodsb                   ;Получаем очередной символ.
           cmp     al,0Dh          ;Конец строки?
           je      GetL            ;Да - на выход... 
           stosb                   ;Нет-охраним символ в переменной FName
           jmp     short Next_char ;Следующий символ... 
GetL:      xor     al,al           ;ASCII 0 в конец
           Mov     al, 0
           stosb
           mov     al,'$' 
           stosb
           clc                     ;Сбросим флаг переноса...
           jmp     GoNext 
Fl:        mov     bl,1
GoNext:    ret                     ;Выходим из процедуры
RCLine     endp 
 
InitProc   proc
           mov     di,offset FName
           xor     dx,dx
           call    RCLine          ; Вызываем процедуру чтения параметров командной строки
           cmp     bl,1            ; если командная строка пустая
           je      HandWr          ; переходим к ручному вводу
           lea     dx,FName 
           jmp     NORM
HandWr:
; Вывод сообщений диалога
           lea      dx,msHelp
           call     WriteCons
           lea      dx,msDiag
           call     WriteCons
           mov      ah,0Ch          ; ф-я - очистка буфера клавиатуры
           int      21h
           mov      dx,offset FName
           mov      ah,0ah          ; ввод строки из клавиатуры в буфер
           int      21h
           mov      di,offset FName
           mov      bx, 0h
           mov      bl, [di+1] 
           mov      BYTE PTR [di+bx+2],0  ; Нужна 0-терминированая строка
                                          ; (asciiz)для этого прибавляем  
                                          ; символ 0 в конце 
           mov      BYTE PTR [di+bx+4],'$'; Добавим символ в конец строки
           mov      dx, offset FName      ; DX<-смещение имени файла
           add      dx,2h                 ; Первые 2 байта содержат 
                                          ; лишнюю информацию и удаляются
NORM:      
;   открываем файл
           mov      al,0            ; открываем для чтения
           mov      ah,3dh          ; функция открытия файла
           int      21h             ; открываем его
           jc       Error           ; проверка на ошибку
           mov      HANDLE,ax       ; запоминаем номер файла
;---определяем длину файла
           mov      ah,42h          ; функция перемещения указателя
           mov      al,2            ; код установки на конец файла
           mov      bx,HANDLE       ; номер файла в BX
           mov      cx,0            ; 0 в CX и DX
           mov      dx,0
           int      21h             ; сдвигаем указатель
           jc       Error           ; ошибка?
           mov      FSIZE_HIGH,DX   ;запоминаем размер файла
           mov      FSIZE_LOW,DX 
           jnc      NoError   
Error:     lea      dx,msErr
           call     WriteCons
           jmp      Exit
NoError:   
           lea      dx,msOK
           call     WriteCons         
           lea      dx, FSIZE_HIGH
           call     WriteCons 
           lea      dx, FSIZE_LOW
           call     WriteCons 
           ret
InitProc   endp
Exit:      mov      ah, 4ch
           int      21h
 
PROGRAM    ends
           end      start
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2011, 20:28
Ответы с готовыми решениями:

Получить атрибуты файла, заданного в командной строке
Не создается com-файл. Пишет что то там с CS:IP не получилось) помогите найти ошибку .286...

TASM. Копирование указанного файла (имена исходного и результирующего файла задаются в командной строке)
Нашел программу, но не смог добиться работы от нее. Описание: Пример программы (в формате DOS...

Удаление файла, введённого в командной строке (Ассемблер)
Товарищи! Помогите пожалуйста решить задачу. Текст задачи: Написать программу ,которая удаляет...

Ввести текст из файла, имя которого задано в командной строке, и вывести на экран
Ввести текст из файла, имя которого задано в командной строке и вывести на экран. Текст занимает...

Поиск заданного файла в заданной папке (путь и имя файла задаются в командной строке)
Добрый вечер! Как сделать поиск заданного файла в заданной папке(путь и имя файла задаются в...

2
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
27188 / 18181 / 7199
Регистрация: 22.10.2011
Сообщений: 32,034
Записей в блоге: 6
26.10.2011, 22:39 2
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Прекрасно компилируется (с небольшой доработкой). Не забывай /t при линковке, это же COM-файл у тебя...

Там были мелкие огрехи, например, дважды размер брался из DX, на самом деле младшая часть - в AX. Убрала также лишние заполнения нулями (за счет инициализации нулями). В дебаггере показывает правильный результат. Добавь процедуру вывода числа, и печатай размеры.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
.286
PROGRAM segment
    assume CS:PROGRAM, DS:PROGRAM, ES:PROGRAM
    org 100h
Start:
    jmp InitProc
    
msHelp     db      10,13, 'Вы можете указать имя файла$'
msDiag     db      10,13, 'Введите путь к файлу:$'
msErr      db      10,13, 'Ошибка: проверьте имя или доступность файла $'
msOK       db      10,13, 'Размер файла$'
mss        db             'Узнается размер$'
 
FName   db 255, ?, 255 dup(0)
 
HANDLE     dw      ? 
FSIZE_HIGH dw      ?
FSIZE_LOW  dw      ?
 
; Вывод сообщения из DX на экран
WriteCons  proc 
           push    ax
           mov     ah,09h
           int     21h
           pop     ax
           ret
WriteCons  endp
 
RCLine proc
    xor bx, bx
    mov si, 80h ; SI = смещение начала командной строки
    lodsb       ; Получим кол-во символов
    cmp al, 0
    je epic_Fail    ; Пустая ком. строка
    inc si      ; SI указывает на 1ый символ строки
Next_char:
    lodsb       ; Получаем очередной символ
    cmp al, 0Dh ; Конец строки?
    je GetL     ; Да - на выход... 
    stosb       ; Нет - сохраним символ в переменной FName
    jmp  short Next_char    ; Следующий символ...
GetL:
    inc di
    mov al, '$'
    stosb
    clc         ; Сбросим флаг переноса...
    jmp     GoNext
epic_Fail:
    mov bl, 1
GoNext:
    ret         ; Выходим из процедуры
RCLine endp
 
InitProc:
    mov di, offset FName    ; ES:DI = адрес FName
    ; xor dx, dx
    call RCLine ; Вызываем процедуру чтения параметров командной строки
    cmp bl, 1   ; если командная строка пустая
    je HandWr   ; переходим к ручному вводу
    
    ; в ком. строке есть имя файла
    lea dx, FName
    jmp NORM
    
HandWr:
    ; Вывод сообщений диалога
    lea dx, msHelp
    call WriteCons
    lea dx, msDiag
    call WriteCons
    mov ah, 0Ch ; ф-я - очистка буфера клавиатуры
    int 21h
    
    mov dx, offset FName
    mov ah, 0ah ; ввод строки из клавиатуры в буфер
    int 21h
    mov di, offset FName
    mov bx, 0h
    mov bl, [di+1]
 
    ; В принципе, и это тоже можно не делать, инициализируется-то нулями изначально
    mov BYTE PTR [di+bx+2], 0   ; Нужна 0-терминированая строка
                    ; (asciiz), для этого прибавляем
                    ; символ 0 в конце
    mov BYTE PTR [di+bx+4], '$' ; Добавим символ в конец строки
    mov dx, offset FName        ; DX<-смещение имени файла
    add dx, 2h          ; Первые 2 байта содержат
                    ; лишнюю информацию и удаляются
NORM:
    ; открываем файл
    mov al, 0       ; открываем для чтения
    mov ah, 3dh     ; функция открытия файла
    int 21h         ; открываем его
    jc Error        ; проверка на ошибку
    mov HANDLE, ax  ; запоминаем номер файла
    
    ; определяем длину файла
    mov ah, 42h     ; функция перемещения указателя
    mov al, 2       ; код установки на конец файла
    mov bx, HANDLE      ; номер файла в BX
    mov cx, 0       ; 0 в CX и DX
    mov dx, 0
    int 21h         ; сдвигаем указатель
    jc Error        ; ошибка?
    mov FSIZE_HIGH, DX  ; запоминаем размер файла
    mov FSIZE_LOW, ax
    jnc NoError
Error:
    lea dx, msErr
    call WriteCons
    jmp Exit
NoError:
    lea dx, msOK
    call WriteCons
    ; Вот это надо заменить на процедуру вывода слова.
    ; Просто печатать так, как ты делаешь - нельзя.
    lea dx, FSIZE_HIGH
    call WriteCons
    lea dx, FSIZE_LOW
    call WriteCons
    
Exit:
    ret
ends PROGRAM
end start
1
Лунный пёс
0 / 0 / 0
Регистрация: 23.12.2009
Сообщений: 12
01.11.2011, 20:16  [ТС] 3
Оу.. там все оказалось что компилятор косой( как только другой взяла все хорошо скопильнулось... и процедуру добавила вывода добавила. теперь все хорошо работает) и даже правильный размер выдает)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
.286
PROGRAM segment
        assume CS:PROGRAM, DS:PROGRAM, ES:PROGRAM
        org 80h
 
        org 100h
Start:
        jmp InitProc
        
msHelp     db      10,13, 'Вы можете указать имя файла$'
msDiag     db      10,13, 'Введите путь к файлу: $'
msErr      db      10,13, 'Ошибка: проверьте имя или доступность файла $'
msOK       db      10,13, 'Размер файла $'
 
FName      db      253,?,255 dup(?) 
 
Handle     dw      ? 
FHigh      dw      ?
FLow       dw      ?
 
; Вывод сообщения из DX на экран
WriteCons  proc 
           push    ax
           mov     ah,09h
           int     21h
           pop     ax
           ret
WriteCons  endp
 
Out_size   proc        
           xor cx,cx       ;Считает отделяемые цифры.
           mov bx,10       
nxt:       mov si,ax       ;Запомним младшее слово.
           mov ax,dx       ;Старшее слово в ax(сначала делим его).
           xor dx,dx
           div bx          ;В ax ст. слово, деленное на 10, в dx остаток.
           mov di,ax       ;Запомним частное в di. 
           mov ax,si       ;Теперь будем делить мл. слово(в dx остаток от предыд. деления).
           div bx          ;Делим его на 10, в ax частное, в dx остаток(искомая цифра).
          push dx         ;Запомним ее.
          inc cx          
          mov dx,di
          or ax,0         
          jnz nxt 
output:   pop ax          ;Восстановим цифру из стека.
          or al,30h       ;Преобразуем в ASCII.
          int 29h         ;Выводим.
          loop output
          ret
Out_size  endp
 
 
RCLine    proc
          xor bx, bx
          mov si, 80h     ; SI = смещение начала командной строки
          lodsb           ; Получим кол-во символов
          cmp al, 0
          je epic_Fail    ; Пустая ком. строка
          inc si          ; SI указывает на 1ый символ строки
Next_char:
        lodsb           ; Получаем очередной символ
        cmp al, 0Dh     ; Конец строки?
        je GetL         ; Да - на выход... 
        stosb           ; Нет - сохраним символ в переменной FName
        jmp  short Next_char    ; Следующий символ...
GetL:
        xor al,al       ;ASCII 0 в конец
        mov al, 0
    stosb
        mov al, '$'
        stosb
        clc                     ; Сбросим флаг переноса...
        jmp     GoNext
epic_Fail:
        mov bl, 1
GoNext:
        ret                     ; Выходим из процедуры
RCLine endp
 
InitProc:
        mov di, offset FName    ; ES:DI = адрес FName
        ;xor dx, dx
        call RCLine     ; Вызываем процедуру чтения параметров командной строки
        cmp bl, 1       ; если командная строка пустая
        je HandWr       ; переходим к ручному вводу
        
        ; в ком. строке есть имя файла
        lea dx, FName
        jmp NORM
        
HandWr:
        ; Вывод сообщений диалога
        lea dx, msHelp
        call WriteCons
        lea dx, msDiag
        call WriteCons
        mov ah, 0Ch     ; ф-я - очистка буфера клавиатуры
        int 21h
        
        mov dx, offset FName
        mov ah, 0ah     ; ввод строки из клавиатуры в буфер
        int 21h
        mov di, offset FName
        mov bx, 0h
        mov bl, [di+1]
 
        ; В принципе, и это тоже можно не делать, инициализируется-то нулями изначально
        mov BYTE PTR [di+bx+2], 0       ; Нужна 0-терминированая строка
                                        ; (asciiz), для этого прибавляем
                                        ; символ 0 в конце
        mov BYTE PTR [di+bx+4], '$'     ; Добавим символ в конец строки
        mov dx, offset FName            ; DX<-смещение имени файла
        add dx, 2h                      ; Первые 2 байта содержат
                                        ; лишнюю информацию и удаляются
NORM:
        ; открываем файл
        mov al, 0               ; открываем для чтения
        mov ah, 3dh             ; функция открытия файла
        int 21h                 ; открываем его
        jc Error                ; проверка на ошибку
        mov Handle, ax  ; запоминаем номер файла
        
        ; определяем длину файла
        mov ah, 42h             ; функция перемещения указателя
        mov al, 2               ; код установки на конец файла
        mov bx, Handle          ; номер файла в BX
        mov cx, 0               ; 0 в CX и DX
        mov dx, 0
        int 21h                 ; сдвигаем указатель
        jc Error                ; ошибка?
        mov FHigh, dx      ; запоминаем размер файла
        mov FLow, ax
        jnc NoError
Error:
        lea dx, msErr
        call WriteCons
        jmp Exit
NoError:
        lea dx, msOK
        call WriteCons
        push ax
        mov dx,FHigh       
        mov ax,FLow
        call Out_Size
        pop ax
Exit:
        ret
ends PROGRAM
end start
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2011, 20:16

Разработать программу, производящую копирование заданного в командной строке файла
Здравствуйте, не могли бы помочь? Не могу разработать программу, производящую копирование заданного...

Написать программу, создающую файл - копию заданного файла. Имена файлов задаются в командной строке
1. Написать программу, создающую файл - копию заданного файла. Имена файлов задаются в командной...

Как в Командной строке получить дату последнего изменения файла или последнего доступа к нему?
суть такова, у меня есть список фаилов с полным адресом типо C:\sad\asds\dich.obj. требуется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru