Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [ASSEMBLER] Задаем вопросы (для новичков) (https://forum.antichat.xyz/showthread.php?t=70421)

4p3 01.09.2008 18:09

Подскажите, пожалуйста, можно ли добиться улучшения быстродействия программы, если попутно использовать FPU. То есть, к примеру, я создаю через CreateThead еще поток, делаю в него вставку asm{} и работаю через FPU, пока тоже самое делает центральный процессор. Пишут вроде как при работающем FPU центральный проц работает отдельно. Еще также интересно вот что: количество FPU зависит от количества ядер проца?

Право даже не знал в какой раздел задать вопрос...

4p3 01.09.2008 23:28

Только сейчас осознал, что не все написал.

Есть два потока. В первом случае. Они просто суммируют числа. при помощи add. Во втором случае первый поток делает все через add. а второй через fld, fadd, fstp.
Надо сравнить быстродействие.

NetSter 10.09.2008 21:53

Доброго времени суток.
1)просьба показать пример собственного (програмного) заполнения векторной таблицы прерываний
2)если это возможно, то и смена местами в таблице аппаратные прерывания Nmi и Intr.
хотелось бы увидеть часть кода на асме которая отображает вышеизложенное.
если есть интересные линки по реализации прерываний и их использование на асме буду оч благодарен.
Заранее спасибо.

Cecil B Demented 12.09.2008 15:40

Хай всем, ребят подскажите плз код простенького на асме - хватание аргументов из командной строки и выполнение их в коммандной строке. У мну аргументы не ловит совсем :( помогите плз :(


Код:

C:\masm32\get.exe netstat -a >> C:\log.log

z01b 12.09.2008 16:36

Цитата:

Сообщение от Cecil B Demented
Хай всем, ребят подскажите плз код простенького на асме - хватание аргументов из командной строки и выполнение их в коммандной строке. У мну аргументы не ловит совсем :( помогите плз :(


Код:

C:\masm32\get.exe netstat -a >> C:\log.log

Не понял вопроса, но мб invoke WinExec,...

FrMn 12.09.2008 18:53

GetCommandLine, откидуешь имя файла, чтоб остались только аргументы(вручную либо CommandLineToArgvW+lstrcatW, либо исчо както). то, что получицо пинаешь в WinExec

bons 13.09.2008 11:27

Цитата:

GetCommandLine, откидуешь имя файла, чтоб остались только аргументы(вручную либо CommandLineToArgvW+lstrcatW, либо исчо както). то, что получицо пинаешь в WinExec
WinExec неудобно использовать вместе с CommandLineToArgvW, потому что нет версии WinExec для юникода.

Можно использовать следующий код:

Код:

.386
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib

.data?
        argc        dd ?
        st_info        STARTUPINFO <>
        pr_info        PROCESS_INFORMATION <>
       
.code

start:
        invoke GetCommandLineW
        invoke CommandLineToArgvW, eax, addr argc
        mov esi, eax

mLoop:
        dec argc
        cmp argc, 0
        je mQuit
        add esi, 4
       
        invoke RtlZeroMemory, addr pr_info, sizeof pr_info
        invoke RtlZeroMemory, addr st_info, sizeof st_info
        mov st_info.cb, sizeof st_info
        mov edx, [esi]
       
        invoke CreateProcessW, 0, edx, NULL, NULL, FALSE, 0, NULL, NULL, addr st_info, addr pr_info
        invoke WaitForSingleObject, pr_info.hProcess, INFINITE
        invoke CloseHandle, pr_info.hProcess
        invoke CloseHandle, pr_info.hThread
       
        jmp mLoop
       
mQuit:
        invoke ExitProcess, 0
end start

но тогда запускать надо примерно так:

Код:

startproc "netstat /a" >> log.txt

FrMn 13.09.2008 12:51

и как CreateProcess должен реагировать, когда получает комманду на запуск >> ? :)
Код:

format PE GUI 4.0
include '%fasminc%/win32a.inc'
section '.code' code readable writeable executable

fmt    db "%s %ws",0
szfile  db "12345.bat",0
entry $
        ;получить и разделить аргументы
        invoke  GetCommandLineW
        push    eax
        invoke  CommandLineToArgvW, eax, esp

        lea    esi,[eax+4]
        pop    edi

        ;выделить строку под склеенные аргументы
        invoke  VirtualAlloc,0,1000h,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE
        mov    ebx,eax
        test    eax,eax
        jz      .exit

        ;склеить аргументы(кроме нулевого)
      @@:
        sub    edi,1
        jz      @f
        lodsd
        cinvoke _snprintf,ebx,1000h,fmt,ebx,eax
        jmp    @b
      @@:

        ;сздать батник
        add    ebx,1
        sub    esp,sizeof.OFSTRUCT
        invoke  OpenFile,szfile,esp,OF_CREATE
        mov    esi,eax
        add    esp,sizeof.OFSTRUCT

        ;записать туда строку
        invoke  lstrlen,ebx
        invoke  WriteFile,esi,ebx,eax,esp,0
        invoke  CloseHandle,esi

        ;запустить
        invoke  WinExec,szfile,SW_HIDE
        invoke  VirtualFree,ebx,0,MEM_RELEASE

        ;удалить
        invoke  DeleteFile,szfile
      .exit:
        invoke  ExitProcess,0


data import
library kernel32,'KERNEL32.DLL',\
          kernel32w,'KERNEL32.DLL',\
          user32,'USER32.DLL',\
          shell32,'shell32.dll',\
          ntdll,'ntdll.dll'

include '%fasminc%\apia\comdlg32.inc'
include '%fasminc%\apia\user32.inc'
include '%fasminc%\apia\kernel32.inc'
import shell32,\
        CommandLineToArgvW,'CommandLineToArgvW'
import kernel32w,\
        GetCommandLineW,'GetCommandLineW'
include '%fasminc%\ntdll.inc'
end data


bons 13.09.2008 13:56

Цитата:

и как CreateProcess должен реагировать, когда получает комманду на запуск >> ?
никак, потому что он ее не получает. Можешь проверить, GetCommandLineW возвращает строку без >>


создавать батник - это уже совсем неоптимально. Например если не будет прав на запись в текущую директорию то утилита не сработает

использовать VirtualAlloc для выделения небольших объемов памяти не очень правильно, т.к. размер выравнивается по размеру страницы

FrMn 13.09.2008 14:14

Цитата:

никак, потому что он ее не получает, поэтому и нужны кавычки.
насколько йа понимаю >> это жизненно важный оператор в данной строке, который указывает, что надобы записать вывод нетстата в файл. будет ли достигнут этот результат при использовании твоей проги - нет.
а >> криэтпроцес получает на втором витке цикла.

Цитата:

использовать VirtualAlloc для выделения небольших объемов памяти не очень правильно
а йа вроде и выделяю 4кб строницу, в чем вопрос?

Цитата:

создавать батник - это уже совсем неоптимально. Например если не будет прав на запись в текущую директорию то утилита не сработает
оптимальнее самому выявлять >, >> и подобные штуки и соответствующим образом на них реагировать?
сделой, чтоб создовалось в темпе, туда доступ вроде как всегда есть.


Время: 21:26