Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 9
NASM

Не считывает файл

01.06.2019, 05:55. Показов 3110. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не считывает и не выводит побайтово файл. Если этот файл закрыть и открыть снова, файл считывается побайтово. Попробовал переставить указатель на начало - перестаёт работать.
С метками и циклами надо разобраться до конца - файл до конца считываться не будет.
Интересующий участок закомментирован, пробовал менять параметры системного вызова - всё равно не выводит байты.

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
section .text
   global _start         ;must be declared for using gcc
    
_start:                  ;tell linker entry point
   
   ;open the file for reading
   mov eax, 5
   mov ebx, file_name1
   mov ecx, 0             ;for read only access
   mov edx, 0777          ;read, write and execute by all
   int  0x80
    
   mov  [fd_in], eax
 
   ; get file size
  mov ebx,eax
  mov eax,19                  ; sys_lseek
  xor ecx,ecx                 ; offset
  mov edx,2                   ; SEEK_END
  int  0x80             ; call
  
   mov [Size],eax              ; save file size
   
  mov ecx, [Size]
  shr ecx, 20
  mov [Count], ecx
  mov ecx, [Size]
  shl ecx, 12
  shr ecx, 12
  mov [Kon], ecx
   
; rewind file
;  mov ebx,[fd_in]
;  mov eax,19                  ; sys_lseek
;  mov ecx,154                 ; offset
 ; mov edx,1                   ; SEEK_END
 ; int  0x80             ; call
   
 mov  [fd_in], eax
  
  mov ecx, [Count]
 
  zicl:
 
  mov [sav],ecx
  
  ;read from file
   mov eax, 3
   mov ebx, [fd_in]
   mov ecx, info
   mov edx, 1048576
   int 0x80
 
  jmp m11
 
  mov ecx, [sav]
 
 loop zicl
 
  ;read from file
   mov eax, 3
   mov ebx, [fd_in]
   mov ecx, info
   mov edx, [Kon]
   int 0x80
 
  ;print the info 
   mov eax, 4
   mov ebx, 1
   mov ecx, info
   mov edx, [Kon]
   int 0x80 
 
  m11:
  mov eax, [Kon]
  mov ecx, [Kon]
  cmp ecx, 0
  
  je m12
  
  m12:
  mov eax, 1048576
  mov ecx, 1048576
 
  mov ebx,0
zicl2:
  push ecx
  
  
  
  mov al, [info+ebx]
  mov [bytebuff], al
  add ebx, 1
  
  
 
  ;print the info 
   mov ecx, bytebuff
   push ebx
   mov eax, 4
   mov ebx, 1
   mov edx, 1
   int 0x80
 
   ; Sleep for 5 seconds and 0 nanoseconds
  mov dword [tv_sec], 1
  mov dword [tv_usec], 0
  mov eax, 162
  mov ebx, timeval
  mov ecx, 0
  int 0x80
 
  pop ebx
  pop ecx
 
  loop zicl2
 
  ; close the file
   mov eax, 6
   mov ebx, [fd_in]
   int  0x80    
       
   mov  eax,1             ;system call number (sys_exit)
   int  0x80              ;call kernel
 
section .data
 
file_name1 db 'enwik8'
 
 
  timeval:
    tv_sec  dd 0
    tv_usec dd 0
 
emessage  db "Continue", 10, 0
  emessagel equ $ - emessage
 
section .bss
 
fd_in  resb 1
Size resb 4
Count resb 4
Kon resb 4
enr resd 1
sav resb 4
info resb  1048576
bytebuff resb 1
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.06.2019, 05:55
Ответы с готовыми решениями:

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

Fread неправильно считывает файл
У меня есть файл вот его скрин в hex редакторе я пытаюсь считать первые 8 байт, вот код: fread(&formCk.ckID,4, 1, file_in);...

Программа не считывает весь файл
Программа не считывает весь текстовый файл, а только последнее слово. С чем это связано ? Например: Есть файл list.txt в нём написано:...

6
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,299
Записей в блоге: 12
05.06.2019, 15:47
1. Неплохо бы проверять результат на ошибку (как минимум открытия файла, а лучше после каждой операции ввода-вывода).

2. Имя фала должно оканчиваться нулём: file_name1 db 'enwik8',0 (у вас там, правда, и так ноль в последующих данных, но это по чистой случайности). Ещё можно попробовать поставить в начало ./, т.е. file_name1 db './enwik8',0, если файл находится в текущем каталоге (но это требование точно гапантировать не могу).

3. Если вы переместили указатель на конец файла, откуда должны читаться данные? В закомментированном коде вы пытаетесь переместить указатель на текущую позицию + 154 байта, т.е. на 154 вперёд от конца. Неудивительно, что ничего не работает. Позиционирование от начала - это когда edx=0.

Остальное просмотрел по диагонали. И да, я наизусть номера функций и какие параметры в каких регистрах должны быть не помню, надеюсь, что тут вы не ошиблись. Но вроде (после беглого прочтения) правильно.
1
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 9
07.06.2019, 16:52  [ТС]
Пробовал в выделенном фрагменте xor ecx ecx xor edx edx и mov ecx, 0 mov edx, 0 - не работает, хотя должно заработать.
Попробовал оффсет с минусом выставть - тоже не помогло. (mov ecx, [Size] neg ecx)
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
07.06.2019, 19:31
У функции lseek параметр offset типа off_t , который определен в
#include <stdio.h>
как
typedef long int __off_t;
typedef __off_t off_t;
В общем он long int , т.е. не двойное слово, а два двойных слова размером.

Добавлено через 1 минуту
Так-что это у тебя
Цитата Сообщение от arego Посмотреть сообщение
; mov ecx,154 ; offset ;
mov edx,1 ; SEEK_END
такой offset получился, а какой там SEEK не определено и скорей всего недопустимый.

Добавлено через 4 минуты
Я так понимаю, что Size у тебя тоже какой-то не такой получался
Цитата Сообщение от arego Посмотреть сообщение
mov [Size],eax ; save file size
, то-то ты там размер файла
Цитата Сообщение от arego Посмотреть сообщение
mov ecx, 1048576
в рукопашную вставлял.

Добавлено через 8 минут
А вообще ты там ужас неопрятно как все делаешь. Поэтому и работает через зад.
Это вот что ? Рассчет сколько полных мегабайтных блоков в файле ?
Цитата Сообщение от arego Посмотреть сообщение
mov ecx, [Size]
shr ecx, 20
mov [Count], ecx
Так на файле короче мегабайта получится ноль и тогда после
Цитата Сообщение от arego Посмотреть сообщение
mov ecx, [Count]
цикл loop zicl два в 32-й степени оборотов нарежет. Команда jecxz для чего придумана ? Для того чтобы при ecx = 0 обойти цикл и получить 0 оборотов. То-то ты jmp m11 из своего цикла выпрыгиваешь.

Добавлено через 4 минуты
==========================

А вообще я бы оформил твой замысел читать блоками в Мегабайт вот таким общим алгоритмом чтения блоками длиной в степень двойки :

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
%assign POWER_OF_TWO 20 ; 20 это для блока в Мегабайт
 
    mov eax, [Size] ;Размер файла
    mov ecx, eax
    mov ebx, (1 << POWER_OF_TWO) - 1    ;Длина полного блока без байта
    add ecx, ebx
    shr ecx, POWER_OF_TWO   ;Блоков в файле включая и неполный
    jz  nothing_to_do   ;Переход если файл длиной ноль
    and eax, ebx    ;Байт в последнем блоке если он неполный, ноль если он полный
    jnz not_full    ;Переход если последний блок не полный
    lea eax, 1[ebx] ;Длина полного блока
not_full:
    mov [Total_Blocks], ecx ;Блоков в файле включая и неполный
    mov [Last_Block_Size], eax  ;Байт в последнем блоке
 
...
 
    mov ecx, [Total_Blocks]
;   jecxz   nothing_to_do   ;Переход если файл длиной ноль (можно тут, а можно там где выше)
zikl:
    push ecx
    mov edx, 1 << POWER_OF_TWO  ;Длина полного блока
    cmp ecx, 1      ;Последний оборот цикла ?
    jne not_last    ;Переход если нет
    mov edx, [Last_Block_Size]
not_last:
    ;читать из файла edx байт, обработать edx байт
    pop ecx
    loop zikl
nothing_to_do:
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
08.06.2019, 07:03
Хотя тут вопрос. Я тут зателнетился на какую-то фряху и запустил
C
1
2
3
4
5
6
#include <stdio.h>
 
void main()
{
    printf("%d", sizeof(off_t));
}
Получил результатом 8 . Потом зателнетился на 32-битный Linux и получил результатом 4 . Так-что может я и ошибался.
0
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 9
08.06.2019, 07:06  [ТС]
Assembler
1
2
3
4
5
6
 ; rewind file
  mov eax,19                  ; sys_lseek
  mov ebx,esi                 ; fd
  xor ecx,ecx                 ; offset 0
  xor edx,edx                 ; SEEK_SET
  int 80h                     ; call
Изначально пробовал вот такой вариант отсюда, только потом стал закрывать и заново открывать файл.

https://codereview.stackexchan... m-assembly
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
08.06.2019, 07:17
C
1
2
3
4
5
6
7
8
#include <stdio.h>
 
void main()
{
    printf("int = %d\n", sizeof(int));
    printf("long int = %d\n", sizeof(long int));
    printf("off_t = %d\n", sizeof(off_t));
}
Результаты :

Linux <CENSORED> 3.16.0-8-686-pae #1 SMP Debian 3.16.64-2 (2019-04-01) i686 GNU/Linux

int = 4
long int = 4
off_t = 4

FreeBSD <CENSORED> 11.2-RELEASE-p10 FreeBSD 11.2-RELEASE-p10 #0: Mon May 13 21:16:14 UTC 2019 root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC i386

int = 4
long int = 4
off_t = 8

Так-что правильно в этом отношении у тебя было. Одно двойное слово в Linux-32 offset . Это меня фряха с толку сбила.
А чего не работает - загадка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.06.2019, 07:17
Помогаю со студенческими работами здесь

Почему не считывает весь файл?
Считывает только часть файла (приблизительно 29 строк любого тхт файла). Подскажите пожалуйста в чём может быть ошибка. Вот часть кода,...

Написать функцию, которая считывает данный файл и перезаписывает данный файл
Задания: Есть файл, в котором записаны числа массива написать функцию, которая считывает данный файл и перезаписывает данный файл таким...

Почему полностью не считывает текстовый файл?
Задание: Текстовый файл содержит записи о телефонах и их владельцах. Переписать в другой файл телефоны тех владельцев, фамилии которых...

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru