Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 04.04.2018
Сообщений: 32
1
MASM

Вывести значения из ячеек в файл (файл создает, но он пустой)

26.10.2022, 20:00. Показов 1494. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
CODE segment
ORG 100h 
START:
data segment
handle  dw ?                ;Ячейка для дескриптора
filename db 'MYFILE.txt',0  ;Имя файла в формате ASCIIZ
buff db 255 dup (?)
string  db  'Data source values! $',13,10 
str db   4 dup (?)
stringln  equ $-string
data ends
 
pushf
push cx
push dx
push bx
push di
push es
push ds
push si
assume   DS:data
mov     AX, data
mov     DS,AX
 
     mov     AH,3Ch          ;Функция создания файла
     mov     CX,0                ;Без атрибутов
     mov     DX, offset filename     ;Адрес имени файла
     int     21h
     mov     handle, AX     
     
 
      mov ax,9000h
      mov es,ax
      mov si,20h
      mov es:word ptr[si+9h],28h
      mov es:word ptr[0040h+00A6h],7Fh
      mov es:word ptr[0040h+00A7h],4h
      mov es:word ptr[0040h+00A8h],5h
      mov es:word ptr[0040h+00A9h],6h
      mov cx,3
     
cycle:  
       mov ax, 9000h
       mov es, ax
       mov ax,es:[si+9h]
       mov bx,2h
       xor dx,dx
       div bx
       mov ax,dx
       cmp dx,0
       jne cycle
       jmp set
      
set:  dec cx
      mov ax,9000h
      mov es,ax
      mov si,40h
      mov ax, word ptr es:[si+00A6h]
      ;mov  buff,al
 
      mov ax,word ptr es:[si+00A6h]
      mov dx,ax
      mov ax,word ptr es:[si+00A8h]
      mov bx,ax
      mov ax, word ptr es:[si+00A9h]
    
      mov ah,40h
      mov bx, handle
      mov cx,2
      mov dx, offset str  
      int 21h
       
            
       
pop si
pop ds
pop es
pop di
pop bx
pop dx
pop cx
popf
    
  ret
CODE ends
end START
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2022, 20:00
Ответы с готовыми решениями:

Составить программу, которая создает каталог, создает в нем файл, переименовывает этот файл и удаляет этот файл, а потом удаляет каталог
Составить программу, которая создает каталог, создает в нем файл, переименовывает этот файл и...

Переписать все положительные числа в пустой файл f, все отрицательные в пустой файл h
Вот задача:type rad = file of integer; Описать процедуру p(g,f,h) от трех файлов типа rаd, которая...

Распарсить тексовый файл и вывести неодходимые значения в другой файл
Добрый день. Мне нужно распарсить тексовый файл и вывести неодходимые значения в другой файл. 1ый...

Написать bat-файл, который создает bat-файл, который создает текстовый файл :)
Необходимо составит bat файл, который создаст bat файл и в созданном новом bat файле создастся...

Копировать значения ячеек в другой файл
Доброго времени суток! Есть задача для автоматизации труда, которую не могу решить...

15
Модератор
1181 / 616 / 282
Регистрация: 10.11.2019
Сообщений: 1,296
27.10.2022, 12:55 2
Надо закрыть файл после записи.
0
0 / 0 / 0
Регистрация: 04.04.2018
Сообщений: 32
27.10.2022, 16:01  [ТС] 3
Спасибо, попробую.То есть каждый раз, когда надо записать значение, если их несколько, перед каждой записью числа надо записать в файл - закрыть файл, следующее значение записать в файл - закрыть файл.Подскажите преобразование нужно делать из числа шестнадцатеричного в строку и только потом уже записать в файл?Записать нужно из ячеек памяти в файл, несколько раз в цикле.
0
Модератор
1181 / 616 / 282
Регистрация: 10.11.2019
Сообщений: 1,296
27.10.2022, 16:28 4
Цитата Сообщение от Andrew16363 Посмотреть сообщение
То есть каждый раз, когда надо записать значение, если их несколько, перед каждой записью числа надо записать в файл - закрыть файл,
Нет, файл удобно закрывать только после завершения всех записей. Т е работает правило бутерброда,
как написал в учебнике информатики Поляков:

1 Открыть (или создать) файл. Здесь в программе на ассемблере обязательно должен проверяться флаг ошибки,
и делается переход (JC address) на завершение при ошибке. При ошибке открытия AX содержит код ошибки, а не номер файла !
2 Работа с данными (чтение, запись, установка позиции в файле)
3 Закрыть файл

Цитата Сообщение от Andrew16363 Посмотреть сообщение
Подскажите преобразование нужно делать из числа шестнадцатеричного в строку и только потом уже записать в файл
Это зависит от того, как Вы собираетесь использовать данные из файла. При программировании на
ассемблере нет разницы - бинарный файл или текстовый. Но как Вы просматриваете результирующий файл -
по F3 из Total Commander или как-то ещё?
0
0 / 0 / 0
Регистрация: 04.04.2018
Сообщений: 32
27.10.2022, 19:15  [ТС] 5
Спасибо.Мне нужно файл проанализировать уже отдельно от программы.То есть мне нужно записать туда числа из ячеек памяти и потом открыть файл в Notepad и просмотреть его.
0
0 / 0 / 0
Регистрация: 04.04.2018
Сообщений: 32
30.10.2022, 20:13  [ТС] 6
Нет закрытие файла не помогло!В чем может еще быть причина?

Добавлено через 1 минуту
Цитата Сообщение от qbfan Посмотреть сообщение
Надо закрыть файл после записи.
Нет закрытие файла не помогло!В чем может еще быть причина?
0
Модератор
Эксперт по электронике
8522 / 4376 / 1648
Регистрация: 01.02.2015
Сообщений: 13,600
Записей в блоге: 9
30.10.2022, 20:21 7
Andrew16363, приводите код для проверки.
0
0 / 0 / 0
Регистрация: 04.04.2018
Сообщений: 32
31.10.2022, 07:35  [ТС] 8
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
CODE segment
ORG 100h 
START:
data segment
handle  dw ?                ;Ячейка для дескриптора
filename db 'MYFILE.txt',0  ;Имя файла в формате ASCIIZ
buff db 255 dup (?)
string  db  'Data source values!'
str db   4 dup (?)
stringln  equ $-string
s_error   db 'Error',13,10,'$'
data ends
 
pushf
push cx
push dx
push bx
push di
push es
push ds
push si
assume   DS:data
mov     AX, data
mov     DS,AX
 
      mov     AH,3Ch          ;Функция создания файла
      mov     CX,0                ;Без атрибутов
      mov     DX, offset filename     ;Адрес имени файла
      int     21h
      mov     handle, AX     
       
      mov ax,9000h
      mov es,ax
      mov si,20h
      mov es:word ptr[si+9h],28h
      mov es:byte ptr[0040h+00A6h],7Fh
      mov es:byte ptr[0040h+00A7h],4h
      mov es:byte ptr[0040h+00A8h],5h
      mov es:byte ptr[0040h+00A9h],6h
      mov cx,3
     
cycle:  
       mov ax, 9000h
       mov es, ax
       mov ax,es:[si+9h]
       mov bx,2h
       xor dx,dx
       div bx
       mov ax,dx
       cmp dx,0
       jne cycle
       jmp set
      
set:  dec cx
      mov ax,9000h
      mov es,ax
      mov si,40h
      mov ax, word ptr es:[si+00A6h]// значение из этой ячеек необходимо в файл записать
      
 
      mov ah,40h
      mov bx,handle
      mov cx,2
      mov dx,ax
      int 21h
      
      
       mov ah,9h
       ;mov bx,handle
       mov cx,2
       mov dx,ax    
       int 21h
        
 
      mov ax,word ptr es:[si+00A6h]
      mov dx,ax
      mov ax,word ptr es:[si+00A8h]
      mov bx,ax
      mov ax,word ptr es:[si+00A9h]
      
      mov ah,9h
      mov bx, handle
      mov cx,stringln
      mov dx, offset string  
      int 21h 
 
   close_file:
          mov ax,3Eh
          mov bx, handle
          jnc exit
          call error_msg
 
     error_msg:
          mov ah,9h
          mov cx,5
          mov dx, offset s_error
           int 21h
       
             
       
pop si
pop ds
pop es
pop di
pop bx
pop dx
pop cx
popf
    
  ret
CODE ends
end START
Добавлено через 1 минуту
С сегмента данных сообщение string db 'Data source values!' сохраняет в файл.Из ячейки памяти нет!
0
Модератор
Эксперт по электронике
8522 / 4376 / 1648
Регистрация: 01.02.2015
Сообщений: 13,600
Записей в блоге: 9
01.11.2022, 13:34 9
Assembler
61
62
63
64
65
      mov ah,40h
      mov bx,handle
      mov cx,2
      mov dx,ax
      int 21h
В строке 64 явная ошибка.
Во первых, содержимое регистра ax в строке 61 изменяется, т.к. регистр ah - это старшая часть регистра ax.
Во вторых, в функцию файловой записи в регистровой паре ds:dx передаётся адрес буфера (ячеек памяти) с данными для записи в файл. Адрес, а не само значение.

Можно поместить в ds нужное значение сегмента, а в dx смещение в сегменте. А потом восстановить исходное значение ds.
Для сохранения слова по адресу [9000h:00A6h]
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
mov bx, [handle] ; <--- именно до изменения ds
 
push ds
mov ax, 9000h
mov ds, ax
 
mov ah, 40h
;mov bx, [handle]   ;<--- тут просто так показано, что в регистре
mov cx, 2
mov dx, 00A6h
int 21h
 
pop ds
0
0 / 0 / 0
Регистрация: 04.04.2018
Сообщений: 32
02.11.2022, 11:39  [ТС] 10
Доброе утро, Павел.Нет в файле все также пусто.У меня сегмент 9000 смещение 0040, а ячейка в этом фрагменте памяти 00A6h(выше в коде это есть я туда записываю значение). Для чего менять сегмент es на ds и загружать туда мой сегмент и смещение?Из памяти es:[0040+00A6h] разве нельзя вывести? Я в es загрузил сегмент 9000h, а в si 0040 смещение, чтобы не менять так как есть ее ячейки в этом сегменте для записи в файл?

Добавлено через 1 час 3 минуты
в dx значение, которое нужно записать в файл верное, а в файле буквы или пустой.

Добавлено через 11 минут
По поводу DS : DX понял ,указатель на область, из которой записываются данные.Но в файл не пишет.

Добавлено через 1 час 14 минут
Assembler
1
2
3
4
  mov ah,9h
        mov cx,2
       mov dx,[si+00A6h]   
       int 21h
В консоль выводит различные символы и йероглифы.
0
Модератор
Эксперт по электронике
8522 / 4376 / 1648
Регистрация: 01.02.2015
Сообщений: 13,600
Записей в блоге: 9
02.11.2022, 13:50 11
В dx должен быть АДРЕС области памяти - конкретно смещение внутри сегмента ds.
Поэтому, если нужно записать в файл содержимое ячейки с адресом 9000h:00A6h, то нужно в ds поместить 9000h, а в dx поместить 00A6h.

Функция записи в файл - 40h.
0
0 / 0 / 0
Регистрация: 04.04.2018
Сообщений: 32
03.11.2022, 08:59  [ТС] 12
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
В dx должен быть АДРЕС области памяти - конкретно смещение внутри сегмента ds.
Поэтому, если нужно записать в файл содержимое ячейки с адресом 9000h:00A6h, то нужно в ds поместить 9000h, а в dx поместить 00A6h.

Функция записи в файл - 40h.
Доброе утро, Павел.Да все сделал как вы описали, но в файл и в консоль также пробовал вывести не записывает.В файле символ пишет.А в консоли набор символов из таблицы ASCII.

Добавлено через 1 минуту
При выполнении функции int 21h в AX записывает 0002 и все.

Добавлено через 37 секунд
В памяти число находится с нужным адресом.
0
Модератор
Эксперт по электронике
8522 / 4376 / 1648
Регистрация: 01.02.2015
Сообщений: 13,600
Записей в блоге: 9
03.11.2022, 15:39 13
Не знаю, что вы делали.
Взял какой-то код с форума по работе с файлами. Всё лишнее удалил, оставил только открытие/запись/закрытие файла, в какую-то ячейку памяти записал текст, этот текст сохранил в файле.
Даже скомпилировалось сразу, и результат в файле тоже есть - текст "Ok!!".
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
.model small
 
.stack 200h
 
.data
        CrLf            db      0Dh, 0Ah, '$'
        msgPressAnyKey  db      0Dh, 0Ah, 'Press any key to exit...', '$'
 
        errFileOpenWr   db      'File open (for write) error', '$'
        errFileWrite    db      'File write error', '$'
        errFileClose    db      'File close error', '$'
 
        DstFileName     db      'outfile.txt', 0
.data?
        DstFileHandler  dw      ?
.code
 
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
 
        ;создание файла для сохранения результата
        mov     ah,     3Ch
        mov     cx,     0000h   ;создать простой файл
        lea     dx,     [DstFileName]
        int     21h
        jnc     @@DstFileOpenOk
                mov     ah,     09h
                lea     dx,     [errFileOpenWr]
                int     21h
                jmp     @@Exit
        @@DstFileOpenOk:
        mov     [DstFileHandler],        ax
        ;подготовка данных в другом сегменте
        mov     ax,     9000h
        mov     es,     ax
        mov     es:[00A6h],     word ptr 'kO'
        mov     es:[00A8h],     word ptr '!!'
 
        ;сохранить результат в итоговый файл
        push    ds
        mov     bx,     [DstFileHandler]
        mov     ax,     9000h
        mov     ds,     ax
        mov     ah,     40h
        mov     cx,     4
        mov     dx,     00A6h
        int     21h
        pop     ds
        jnc     @@DstFileWriteOk
                ;если ошибка записи - вывести диагностическое сообщение
                mov     ah,     09h
                lea     dx,     [errFileWrite]
                int     21h
        @@DstFileWriteOk:
 
        ;закрытие итогового файла
        mov     ah,     3Eh
        mov     bx,     [DstFileHandler]
        int     21h
        jnc     @@SrcFileClose
                mov     ah,     09h
                lea     dx,     [errFileClose]
                int     21h
        @@SrcFileClose:
 
@@Exit:
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
        mov     ah,     00h
        int     16h
 
        ;завершение программы
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main
0
0 / 0 / 0
Регистрация: 04.04.2018
Сообщений: 32
06.11.2022, 18:44  [ТС] 14
Добрый вечер, Павел.Код, который вы мне предоставили,я попробовал, он работает(спасибо), аналогично и мой вышеизложенный.Но нюанс в том,что вы загружаете строку в ячейку, а попробуйте изменить строку " ko" на число 7h и посмотрите, что запишется в файл txt.Я в предоставленном коде изменил "ko" на число и в файле записались символы.Со строками нет проблем они записываются корректно.Но мне то нужно считывать числа из памяти, а не строки.
0
Модератор
Эксперт по электронике
8522 / 4376 / 1648
Регистрация: 01.02.2015
Сообщений: 13,600
Записей в блоге: 9
06.11.2022, 19:09 15
Andrew16363, боюсь, что мы разговариваем в разных терминах.
Когда я говорю, что записываю число в файл, то подразумеваю формат записи идентичный формату хранения этого же числа в памяти.
Если открыть созданный файл в hex-редакторе, то увидите
00000000: 4f 6b 21 21 Ok!!

Если сделать замену
Assembler
38
39
        mov     es:[00A6h],     word ptr 7h
        mov     es:[00A8h],     word ptr '!!'
То, открыв файл в hex-редакторе, увидите
00000000: 07 00 21 21 ..!!

Т.е. программа работает.

Если хотите сохранять число из ячейки в текстовом формате в десятичой системе счисления, то возьмите процедуру
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
;преобразование 16-разрядного числа со знаком в строку
;на входе:
;  ax - число для преобразования
;  ds:[di] - адрес буфера строки
;на выходе:
;  ds:[di] - строка с записью числа
;  ax - длина строки
UInt16ToStr     proc
        push    bx
        push    cx
        push    dx
        push    di
        mov     bx,     10      ;делитель (основание системы счисления)
        xor     cx,     cx      ;cx - цифр в числе (длина строки)
        @@div:
                xor     dx,     dx      ;делим (dx:ax) на bx
                div     bx
                add     dl,     '0'     ;преобразуем остаток деления в символ цифры
                push    dx              ;и сохраняем его в стеке
                inc     cx              ;увеличиваем счётчик цифр
                or      ax,     ax      ;в числе ещё есть цифры?
        jnz     @@div                   ;да - повторить цикл выделения цифры
        mov     ax,     cx      ;длина строки возвращается в ax
        @@store:
                pop     bx      ;извлекаем из стека очередную цифру
                mov     [di],   bl      ;сохраняем в строке
                inc     di      ;переходим к следующему элементу строки
        loop    @@store         ;и так поступаем столько раз, сколько нашли цифр в числе (cx)
        pop     di
        pop     dx
        pop     cx
        pop     bx
        ret
UInt16ToStr     endp
и определите текстовый буфер
Assembler
1
2
3
.data?
        abBuffer        db      1024 dup(?)
        nStrLen         dw      ?
Далее загрузите в ax требуемое число и выполните преобразование
Assembler
1
2
3
4
5
6
mov ax, число
lea di, [abBuffer]
call UInt16ToStr
mov [nStrLen], ax
 
далее сохраните в файле не число из памяти, а текстовую строку из буфера abBuffer длиной nStrLen
0
0 / 0 / 0
Регистрация: 04.04.2018
Сообщений: 32
11.11.2022, 20:47  [ТС] 16
Добрый вечер, Павел.Спасибо большое.Разобрался все работает.Благодарен за информацию.
0
11.11.2022, 20:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2022, 20:47
Помогаю со студенческими работами здесь

Создать файл произвольных символов. Вывести в один файл цифры, содержащиеся в файле, а в другой файл символы, сохранив первоначальный порядок. Вывести
Создать файл произвольных символов. Вывести в один файл цифры, содержащиеся в файле, а в другой...

Создать командный файл, который создает файл дерева каталогов
Создать файл дерева каталогов и запускать его для редактирования в wordpad.

файл который создает xml файл со списком купонов для сайта купонатор
Помогите найти файл который создает xml файл со списком купонов для сайта купонатор. пожалуйста...

Написать командный файл, который создает текстовый файл в указанном подкаталоге корневого диска...
Помогите сделать(((не могу(((сколько бы не пробовала.Написать командный файл, который создает...

Создать пустой бинарный файл, открыть существующий файл, добавить в него 20 действительных чисел
Создать пустой бинарный файл, открыть существующий файл, добавить в него 20 действительных чисел,...

Почему не создаётся файл и не производится запись в пустой файл?
Помогите разобраться почему не создаётся файл и не производится запись в пустой файл, в дебагере...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru