Вот программа, написанная под NASM. Цель: инвертировать строку из 10 символов. Она работает, но когда вводим больше 10 символов, то первые 10 выводятся инвертированными, а оставшаяся часть выводится в командную строку и "нажимается" Enter. Что поменять, чтоб оставшиеся символы игнорировались?
В *NIX строковые операции всегда буферезируются. Для скорейшего последующего доступа. И ; System call #4 "write" выводит на экран то что находится в буфере (10 инвертированных символов + всё остальное). fflush(NULL) - сбросить все буферы. (это в СИ) Номер сис вызова в *NIX точно не знаю
не ленимся..и читаем. UNIX Профессиональное программирование 416 стр. У. Ричард Стивенс Стивен А. Раго Номера системных вызовов в Mandriva у меня находятся в /usr/include/asm/unistd_32.h
134 sys_bdflush int long Вот нашел такой системный вызов, это он? Написано, что в ebx надо тип int, а в ecx - тип long. Только что туда помещать?
Вы уж не серчайте. Просто я под Linux только вторую прогу пишу. В системных вызовах с "flush" есть только тот, который выше указал. А вот, что по нему нашел, http://www.opennet.ru/man.shtml?topic=bdflush&category=2&russian=2 Ну из этого все равно не понял, что передавать в качестве параметров.
Лень было разбираться с твоим кодом.... и я решил, сделать, просто вот так.. Код (Text): section .data path_file db 'test.ghex',0 msg1 db ' Input string: ', 0x0A msg1_len equ $ - msg1 msg2 db 'Запись в файл: ', 0x0A msg2_len equ $ - msg2 empt db 0Dh,0Ah empt_l equ $ - empt section .bss fd resd 1 ; резервируем 4 байт для возвращаемого дескриптора функции open buf1 resb 10 buf1_l equ $ - buf1 buf2 resb 10 buf2_l equ $ - buf2 section .text global _start _start: ; System call #4 "write" mov eax,4 mov ebx,1 mov ecx,msg1 mov edx,msg1_len int 80h ; System call #3 "read" mov eax,3 mov ebx,0 mov ecx,buf1 mov edx,buf1_l int 80h ; Копирование с конца buf1 и запись с начала buf2 mov esi,buf1 ; В esi указатель на первую букву buf1 add esi,eax dec esi mov edi,buf2 ; В edi указатель на первую букву buf2 cmp eax,10 ; В eax возвращается реальная длина, если 10, то нет \n, в буфере только строка ; иначе - строка вместе со \n jnz minus ; Если значение в eax<10, то esi-1, jmp next ; иначе - esi без изменений minus: ; Вычитание из esi 1 dec esi next: mov ebx,buf1 ; В ebx указатель на первую букву buf1 dec ebx begin: std lodsb cld stosb cmp esi,ebx jz stopp jmp begin stopp: ; System call #4 "write" mov eax,4 mov ebx,1 mov ecx,msg2 mov edx,msg2_len int 80h ; System call #4 "write" mov eax,4 mov ebx,1 mov ecx,empt mov edx,empt_l int 80h ;системный вызов open mov eax,5 ; syscall open mov ebx,path_file mov ecx,0001002 mov edx,7666 int 0x80 mov [fd],eax ; записываем в fd номер возвращённого дескриптора функции open ;системный вызов write ; System call #4 "write" mov eax,4 mov ebx,[fd] ; сохраняем в дескриптор открытого файла mov ecx,buf2 mov edx,buf2_l int 80h ;Тут можно просто всё содержимое файла вывести на экран )...вобщем сам сделаешь....... ;системный вызов close mov eax,6 mov ebx,[fd] int 0x80 incorrect: mov eax, 1 ; syscall exit xor ebx,ebx ; поместить 0 в ebx int 0x80 ; Обратится к ядру для возбуждения системного вызова Кстати, яб никогда б не стал такой код писать)... Уж проще было использовать push и pop....
Ок, спасибо, буду разбираться. Только последний вопрос, куда денется та часть, которая оказалась буферизованной?
Точно не знаю ).. но полагаю что тамже и останется (в буфере) Просто теперь, мы будем оперировать не с буфером данных(где может быть записано больше 10 символов) , а с данными в файле (в который мы записываем жостко ограниченное колличество байт).