Лидеры рейтинга

ID: 405049

vsetin

Студент

2828


ID: 401284

Михаил Александров

Советник

906

Россия, Санкт-Петербург


ID: 226425

Konstantin Shvetski

Модератор

662

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

380

Россия, пос. Теплоозёрск, ЕАО


ID: 400669

epimkin

Профессионал

350


ID: 325460

CradleA

Мастер-Эксперт

297

Беларусь, Минск


ID: 137394

Megaloman

Мастер-Эксперт

260

Беларусь, Гомель


8.9.0

20.06.2021

JS: 2.9.2
CSS: 4.5.10
jQuery: 3.6.0
DataForLocalStorage: 2021-06-22 16:46:03-standard


Создание программ на языке Assembler.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)

Консультация онлайн # 159688

Раздел: Assembler
Автор вопроса: Ska89
Дата: 05.02.2009, 16:50 Консультация закрыта
Поступило ответов: 1

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

Здравствуйте, Ska89!
Держите программу под masm32.
По умолчанию, если ничего не задано параметром, ищет все файлы в текущей папке по маске *.txt
Можно задать параметром любой путь с маской.
Чтобы откомпилировать, необходимо создать BAT-файл следующего содержания:
Код
@echo off
:n - имя файла программы
set n=mdir
if exist %n%.obj del %n%.obj
if exist %n%.exe del %n%.exe

: -----------------------------------------
: assemble %n%.asm into an OBJ file
: -----------------------------------------
\MASM32\BIN\Ml.exe /c /coff /Fl %n%.asm
if errorlevel 1 goto errasm

: --------------------------------------------------
: link the main OBJ file with the resource OBJ file
: --------------------------------------------------
\MASM32\BIN\Link.exe /SUBSYSTEM:CONSOLE %n%.obj
if errorlevel 1 goto errlink

dir %n%.*

goto TheEnd

:errlink
: ----------------------------------------------------
: display message if there is an error during linking
: ----------------------------------------------------
echo.
echo There has been an error while linking this project.
echo.
goto TheEnd

:errasm
: -----------------------------------------------------
: display message if there is an error during assembly
: -----------------------------------------------------
echo.
echo There has been an error while assembling this project.
echo.

:TheEnd
pause

PS Код не мой, слегка подправлен код из примеров masm-а (Зачем изобретать велосипед?)

Приложение:


Лысков Игорь Витальевич

Мастер-Эксперт
09.02.2009, 14:34
Мини-форум консультации # 159688
Boriss

1

= общий =    05.02.2009, 20:20

А текущем каталоге, в задаваемом ... ? Всех-то на современном компьютере ох как много ...

q_id

Зенченко Константин Николаевич

Старший модератор

ID: 31795

2

= общий =    05.02.2009, 21:57

А Вам, DOS или Windows?
smile

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

q_id

Лысков Игорь Витальевич

Мастер-Эксперт

ID: 7438

3

= общий =    06.02.2009, 00:54

И если под ДОС, то работаем с короткими именами или с длинными?
Искать по всему диску? По всем подкаталогам заданного каталога?
Как задавать начальный путь поиска и маску файлов? Задать в тексте программы, вводить в командной строке, запросить с клавиатуры...
Видите, сколько неопределенностей в вашем вопросе. smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

неизвестный

4

= общий =    09.02.2009, 14:07

в задаваемом каталоге,нужна программка под windows,задать в тексте программы!!!спасибо что уточнили!!!

Boriss

5

= общий =    09.02.2009, 14:15

Да не совсем: в чем писать-то? TASM, MASM32, MASM611, ...

q_id

Лысков Игорь Витальевич

Мастер-Эксперт

ID: 7438

6

= общий =    09.02.2009, 14:42

Boriss:

нужна программка под windows


Выбор уже меньше: tasm32 или masm32 smile
Разные там fasm, wasm не рассматриваем

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

неизвестный

7

= общий =    09.02.2009, 17:28

а можно в fasmw?или никак???: smile

q_id

Лысков Игорь Витальевич

Мастер-Эксперт

ID: 7438

8

= общий =    10.02.2009, 13:51

Почему никак? Можно и в fasmw... Как скажете...:)
Пришлось добавить подпрограмму получения параметра командной строки.
В Masm-е она стандартная...Это одна из причин, почему лично я предпочитаю masm.

Код
format	PE console
	entry	start

	include 'win32a.inc'

; #########################################################################
section '.data' readable writable
lf		db	13,10,0
wCard		db	"*.txt",0
wCald.len	=	$ - wCard	
notfound	db	"File not found",13,10,0
spc		db	" ",0
bytes		db	" bytes",0
fMtStrinG	db	"%lu",0

section '.bss' readable writable
hSearch 	dd	?		; search handle
sizeBuffer	db	16 dup(?)
fBuffer 	db	256 dup (?)	; file name buffer
clBuffer	db	128 dup (?)	; command line buffer
wfd		WIN32_FIND_DATA <>

; #########################################################################
section '.code' code readable executable

start:
	stdcall GetCL, 1, clBuffer	; get arg 1
	cmp	eax, 1
	je	@@13			; if no arg
	mov	ecx, wCald.len		; copy *.txt into
	mov	esi, wCard		; clBuffer
	mov	edi, clBuffer
	rep	movsb
@@13:
	invoke	FindFirstFileA,clBuffer,wfd
	cmp	eax, INVALID_HANDLE_VALUE
	jne	@@14
	cinvoke printf, notfound	 ; display "not found" message
	jmp	TheEnd
@@14:
	mov	[hSearch], eax
@@loop:
	cinvoke printf, wfd.cFileName
	mov al, [wfd.cFileName]
	cmp al, "."
	je nxt
	cinvoke printf, spc
	invoke	printf, fMtStrinG, [wfd.nFileSizeLow]
	invoke	printf, bytes
nxt:
	invoke	printf, lf
@@next:
	invoke	FindNextFileA,[hSearch], wfd
	cmp	eax, 0
	jne	@@loop

	invoke	FindClose, [hSearch]

TheEnd:
	invoke	exit,0

; #########################################################################

proc	GetCL uses esi edi, ArgNum:DWORD, ItemBuffer:DWORD

	; -------------------------------------------------
	; arguments returned in "ItemBuffer"
	;
	; arg 0 = program name
	; arg 1 = 1st arg
	; arg 2 = 2nd arg etc....
	; -------------------------------------------------
	; Return values in eax
	;
	; 1 = successful operation
	; 2 = no argument exists at specified arg number
	; 3 = non matching quotation marks
	; 4 = empty quotation marks
	; -------------------------------------------------

	local	lpCmdLine	:DWORD
	local	cmdBuffer[192]	:BYTE
	local	tmpBuffer[192]	:BYTE

	invoke	 GetCommandLineA
	mov	[lpCmdLine], eax	; address command line
	; -------------------------------------------------
	; count quotation marks to see if pairs are matched
	; -------------------------------------------------
	xor	ecx, ecx		; zero ecx & use as counter
	mov	esi, [lpCmdLine]
	
@@1:
	lodsb
	cmp	al, 0
	je	@@2
	cmp	al, 34		; [ " ] character
	jne	@@1
	inc	ecx		; increment counter
	jmp	@@1
@@2:

	push	ecx		; save count

	shr	ecx, 1		; integer divide ecx by 2
	shl	ecx, 1		; multiply ecx by 2 to get dividend

	pop	eax			; put count in eax
	cmp	eax, ecx		; check if they are the same
	je	@@12
	mov	eax, 3		; return 3 in eax = non matching quotation marks
	ret
@@12:

	; ------------------------
	; replace tabs with spaces
	; ------------------------
	mov	esi, [lpCmdLine]
	lea	edi, [cmdBuffer]

@@3:
	lodsb
	cmp	al, 0
	je	rtOut
	cmp	al, 9	; tab
	jne	rtIn
	mov	al, 32
rtIn:
	stosb
	jmp	@@3
rtOut:
	stosb		; write last byte

	; -----------------------------------------------------------
	; substitute spaces in quoted text with replacement character
	; -----------------------------------------------------------
	lea	eax, [cmdBuffer]
	mov	esi, eax
	mov	edi, eax

subSt:
	lodsb
	cmp	al, 0
	jne	@@4
	jmp	subOut
@@4:
	cmp	al, 34
	jne	subNxt
	stosb
	jmp	subSl	; goto subloop
subNxt:
	stosb
	jmp	subSt

subSl:
	lodsb
	cmp	al, 32	; space
	jne	@@5
	mov	al, 254 ; substitute character
@@5:
	cmp	al, 34
	jne	@@6
	stosb
	jmp	subSt
@@6:
	stosb
	jmp	subSl

subOut:
	stosb		; write last byte

	; ----------------------------------------------------
	; the following code determines the correct arg number
	; and writes the arg into the destination buffer
	; ----------------------------------------------------
	lea	eax, [cmdBuffer]
	mov	esi, eax
	lea	edi, [tmpBuffer]

	mov	ecx, 0		; use ecx as counter

	; ---------------------------
	; strip leading spaces if any
	; ---------------------------
@@7:
	lodsb
	cmp	al, 32
	je	@@7

l2St:
	cmp	ecx, [ArgNum]	; the number of the required cmdline arg
	je	clSubLp2
	lodsb
	cmp	al, 0
	je	cl2Out
	cmp	al, 32
	jne	cl2Ovr		; if not space

@@8:
	lodsb
	cmp	al, 32		; catch consecutive spaces
	je	@@8

	inc	ecx			; increment arg count
	cmp	al, 0
	je	cl2Out

cl2Ovr:
	jmp	l2St

clSubLp2:
	stosb
@@9:
	lodsb
	cmp	al, 32
	je	cl2Out
	cmp	al, 0
	je	cl2Out
	stosb
	jmp	@@9

cl2Out:
	mov	al, 0
	stosb

	; ------------------------------
	; exit if arg number not reached
	; ------------------------------
	cmp	ecx, [ArgNum]
	jae	@@17
	mov	edi, [ItemBuffer]
	mov	al, 0
	stosb
	mov	eax, 2	; return value of 2 means arg did not exist
	ret
@@17:

	; -------------------------------------------------------------
	; remove quotation marks and replace the substitution character
	; -------------------------------------------------------------
	lea	eax, [tmpBuffer]
	mov	esi, eax
	mov	edi, [ItemBuffer]

rqStart:
	lodsb
	cmp	al, 0
	je	rqOut
	cmp	al, 34	; dont write [ " ] mark
	je	rqStart
	cmp	al, 254
	jne	@@10
	mov	al, 32	; substitute space
@@10:
	stosb
	jmp	rqStart

rqOut:
	stosb		; write zero terminator

	; ------------------
	; handle empty quote
	; ------------------
	mov	esi, [ItemBuffer]
	lodsb
	cmp	al, 0
	jne	@@11
	mov	eax, 4	; return value for empty quote
	ret
@@11:

	mov	eax, 1	; return value success
	ret
endp

; #########################################################################

	section '.idata' data import readable writable
library msvcrt,'msvcrt.dll',\
	kernel32,'kernel32.dll'

import	msvcrt,\
	printf,'printf',\
	sprintf,'sprintf',\
	exit,'exit'

import	kernel32,\
	FindFirstFileA,'FindFirstFileA',\
	FindNextFileA,'FindNextFileA',\
	FindClose,'FindClose',\
	GetCommandLineA,'GetCommandLineA'

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

неизвестный

9

= общий =    10.02.2009, 18:00

а мне вот наоборот в fasmw надо работать!!!спасибо за код программки!!!! smile

q_id

Зенченко Константин Николаевич

Старший модератор

ID: 31795

10

= общий =    10.02.2009, 18:08

smile
На будущее указывайте компилятор, а то Игорь Витальевич мог Вам написать и на CompModel.
smile smile

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

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

Лучшие эксперты раздела

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 173

Kdsfofwe21

2-й класс

Рейтинг: 120

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 98

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Evgen aka Chuma

6-й класс

Рейтинг: 0

cain52

3-й класс

Рейтинг: 0