Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2013, 13:47   #1
Satansoft
Пользователь
 
Регистрация: 24.11.2012
Сообщений: 40
Сообщение Объединение двух программ в одном проекте

Сам проект содержит лишь меню, строку ввода, прыжки по меткам в зависимости от введенной цифры, а также вынесены секции данных и библиотек обоих инклудов. Данные меню, 1-й программы и 2-й программы, в секции, разделены 2 пустыми строками.

Не прыгает к метке Next.

Основной проект, Меню:
Код:
format PE console 4.0
entry Start
 
include 'win32a.inc'

formatt_ db '%d',0
buffer rb 16
string db '1. Task 1',0dh,0ah,\
'2. Task 2',0dh,0ah,\
'3. Exit',0dh,0ah,\
0dh,0ah,'Choose: ',0


section '.data' data readable writeable
mas dw 4, 6, 9, 43, 23, 78, 12, 9, 8, 30
len=$-mas
a dw ? 
b dw ?
fmt db 'a=%d, b=%d',0


_FileExt rb 32
fd WIN32_FIND_DATA
size = $-fd
hfind dd 0
message db 'Type the file number',0dh,0ah,0
format_ db '%3.2d %s',0
number dd 1
error db 'Not equale',0
ok db 'Equale',0
nofiles db 'No such files in the directory.',0dh,0ah,\
'Press any key...',0
getextension db 'Type the file extension',0dh,0ah,0
cb dd 0


section '.text' code readable executable 
Start:

invoke printf,string

invoke scanf,formatt_,buffer 

cmp [buffer],1
je First
jne Exit
cmp [buffer],2
je Next
jne Exit
cmp [buffer],3
je Exit

First:
include 'First.asm'

Next:
include 'Next.asm'

Exit:
invoke ExitProcess,0

section '.idata' import data readable 
library kernel, 'KERNEL32.DLL',\
          msvcrt,'MSVCRT.DLL'
          
  import msvcrt,\
    printf,'printf',\
    _getch,'_getch',\ 
    scanf, 'scanf',\
    gets, 'gets'

  import kernel,\
    SetConsoleTextAttribute,'SetConsoleTextAttribute',\
    GetStdHandle,'GetStdHandle',\
    FindFirstFile, 'FindFirstFileA',\
    FindNextFile, 'FindNextFileA',\
    FindClose, 'FindClose',\
    GetProcessHeap, 'GetProcessHeap',\
    HeapAlloc, 'HeapAlloc',\
    HeapReAlloc, 'HeapReAlloc',\
    HeapFree, 'HeapFree',\
    CreateFile, 'CreateFileA',\
    CloseHandle, 'CloseHandle',\
    ReadFile, 'ReadFile',\
    ExitProcess, 'ExitProcess'
First.asm:
Код:
mov esi,2
xor edi,edi
mov ecx,len/2-2
 
@@:
mov ax,[mas+esi]
cmp ax,[mas]
jbe @1
cmp ax,[mas+len/2-2]
jae @1
 
test edi,edi
jnz @2
inc edi
mov [a],ax
jmp @1
 
@2:
mov [b],ax
 
@1:
add esi,2
loop @b
 
movzx ecx,[a]
movzx ebx,[b]
 
invoke printf,fmt,ecx,ebx
invoke _getch

invoke ExitProcess, 0
Next.asm:
Код:
invoke printf,getextension

invoke gets,_FileExt

invoke GetProcessHeap
mov edi,eax
invoke HeapAlloc,edi,HEAP_ZERO_MEMORY,size
mov esi,eax

invoke FindFirstFile,_FileExt,esi
test eax,eax
jns @f

invoke printf,nofiles
jmp exit

@@:
mov [hfind],eax

xor ebx,ebx
push 0a0dh

@@:
lea eax,[esi+WIN32_FIND_DATA.cFileName+ebx]

invoke printf,format_,[number],eax
inc [number]
invoke printf,esp

add ebx,size
lea eax,[ebx+size]

invoke HeapReAlloc,edi,HEAP_ZERO_MEMORY,esi,eax
mov esi,eax
add eax,ebx
invoke FindNextFile,[hfind],eax

test eax,eax
jnz @b
add esp,4
invoke FindClose,[hfind]
mov dword [format_],'%d'

invoke printf,message
invoke scanf,format_,number

call open_file
push eax
push ebx

invoke printf,message
invoke scanf,format_,number

call open_file
pop edx
push eax

mov ecx,error

cmp edx,ebx
jnz @f

push ecx
push esi

shl edx,1
invoke HeapAlloc,edi,HEAP_ZERO_MEMORY,edx
mov esi,eax

invoke ReadFile,dword [esp+24],esi,ebx,0,cb
mov eax,esi
add eax,ebx
invoke ReadFile,dword [esp+28],eax,ebx,0,cb

push edi
push esi
mov edi,esi
mov ecx,ebx
add edi,ecx
repe cmpsb
sete bl
pop esi
pop edi

invoke HeapFree,edi,HEAP_NO_SERIALIZE,esi
pop esi
pop ecx
test bl,1
jz @f

mov ecx,ok

@@:
invoke printf,ecx

invoke CloseHandle
invoke CloseHandle

exit:
invoke HeapFree,edi,HEAP_NO_SERIALIZE,esi
invoke _getch

invoke ExitProcess,0
 
open_file:

mov ecx,[number]
dec ecx
imul edx,ecx,size

lea edx,[esi+WIN32_FIND_DATA.cFileName+edx]
mov ebx,[edx-12]

invoke CreateFile,edx,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0

invoke ExitProcess, 0

Последний раз редактировалось Satansoft; 07.12.2013 в 13:50.
Satansoft вне форума Ответить с цитированием
Старый 07.12.2013, 17:31   #2
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Satansoft, хорошую тактику Вы выбрали. Кочуете по форумам. Как же к метке Next оно прыгнет? А? Хоть загляните в справочник, какие строки форматирования бывают, гляньте.

Последний раз редактировалось vadimych; 07.12.2013 в 17:33.
vadimych вне форума Ответить с цитированием
Старый 07.12.2013, 21:32   #3
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

А блин, не заметил, что строки форматирования две. И не заметил тоже, что вместо ret в процедуре ExitProcess влеплен. Не в коня корм, короче.
vadimych вне форума Ответить с цитированием
Старый 07.12.2013, 22:01   #4
Satansoft
Пользователь
 
Регистрация: 24.11.2012
Сообщений: 40
По умолчанию

Цитата:
хорошую тактику Вы выбрали. Кочуете по форумам.
Не тактика это, незачем обитателей излишним присутствием своим напрягать. Задачка сама изначально была объемной: 2 программы объединить с меню в одном проекте и в каждой теме решалась лишь часть её, а горе-студент решил, что хоть скомпоновать их сможет и вот, застрял, не ругайтесь, ладушки? ^^

Цитата:
какие строки форматирования бывают, гляньте.
Строки форматирования чего? Оформлял меню ориентируясь на ваш код.

Цитата:
И не заметил тоже, что вместо ret в процедуре ExitProcess влеплен.
После выполнения завершается.
Satansoft вне форума Ответить с цитированием
Старый 07.12.2013, 23:08   #5
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Satansoft, ret верните на место.
vadimych вне форума Ответить с цитированием
Старый 07.12.2013, 23:18   #6
Satansoft
Пользователь
 
Регистрация: 24.11.2012
Сообщений: 40
По умолчанию

vadimych, вернул, да и прежде чем заботиться о конце процедуры, хорошо, что бы она сначала началась... Может меню криво описал, что не желает прыгать?
Satansoft вне форума Ответить с цитированием
Старый 07.12.2013, 23:27   #7
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Код:
cmp [buffer],1
je First
cmp [buffer],2
je Next
cmp [buffer],3
je Exit
vadimych вне форума Ответить с цитированием
Старый 07.12.2013, 23:38   #8
Satansoft
Пользователь
 
Регистрация: 24.11.2012
Сообщений: 40
По умолчанию

vadimych, я jne затем добавил, чтобы любая другая цифра завершала процесс, а иначе все кроме 2 и 3 процедуру First вызывают...

Из-за меню или нет, но при вызове процедуры Second, в её буфер для задания параметра (маски файла) заносится результат из [buffer].
Satansoft вне форума Ответить с цитированием
Старый 08.12.2013, 03:10   #9
Satansoft
Пользователь
 
Регистрация: 24.11.2012
Сообщений: 40
По умолчанию

Однако если

Код:
invoke scanf,formatt_,buffer
заменить на

Код:
mov [buffer], 2
то выбивается окно параметров.

А ошибка в формате записи:

Код:
formatt_ db '%d',0
только не ясно какая

Последний раз редактировалось Satansoft; 08.12.2013 в 03:42.
Satansoft вне форума Ответить с цитированием
Старый 08.12.2013, 06:39   #10
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Satansoft, замените gets на scanf со строкой форматирования '%s',0.
vadimych вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TOOLTIP_CLASS - В одном проекте работает, а в другом нет BLACK_RAIN Win Api 3 27.09.2013 15:07
Eclipse две программы в одном проекте vovik93 Общие вопросы по Java, Java SE, Kotlin 0 18.07.2012 15:16
Общие сохранение форм в одном проекте Vadja-Son Общие вопросы Delphi 6 03.02.2012 15:23
Объединение двух программ. Nicole Помощь студентам 4 08.01.2011 12:07
C#,J#,Assembler в одном проекте. Tatarin_86 Помощь студентам 0 31.03.2010 22:10