На С++ выглядит так. А как это на масме делается? char Names [] = { "Text", "Text dlinniy", "Text3", }
Эт нужно для вот этой вещи: for (i = 0; i < 128; i++) { SendDlgItemMessage(hDlg, IDC_INSTRUM, CB_ADDSTRING, 0, (LPARAM)Names ); } Как это реализовавыется?
Под винду не программирую...на сайте есть документация к nasm там есть примеры вызовов функций и тд.....есть примеры... да и тут есть немного http://wasm.ru/forum/viewtopic.php?id=30434
что-то типа Код (Text): szText1 db "Text",0 szText2 db "Text dlinniy",0 szText3 db "Text3",0 ;.... Names: dd szText1 dd szText2 dd szText3 ;... sub ebx,ebx l00p: invoke SendDlgItemMessage,[hDlg],IDC_INSTRUM,CB_ADDSTRING,0,[Names+ebx*4] inc ebx cmp ebx,127 jbe l00p
немного изменю.. Код (Text): szText1 db "Text",0 szText2 db "Text dlinniy",0 szText3 db "Text3",0 ;.... Names: dd szText1 dd szText2 dd szText3 ;... xor ebx,ebx l00p: invoke SendDlgItemMessage,[hDlg],IDC_INSTRUM,CB_ADDSTRING,0,[Names+ebx*4] add ebx,1 ; если не ошибаюсь, работает быстрей чем inc cmp ebx,127 jbe l00p
xor ebx,ebx тоже быстрее sub ebx,ebx? Если серьезно, то тогда уж, ИМХО, имеет смысл заменить некоторые параметры на регистры.
Я тоже почему-то думаю что xor бысрее чем sub. Наверное потому что Булевые операции - родные для электроники, а вычитание они выполняют искуственно. При xor проц только проводит операцию над каждым битом, а при sub вычитании надо еще занимать знаки из старших разрядов и запоминать промежуточный результат.
ыы? читай маны, потом чтото утверждай. не ошибаешся, но по сравнению со временем вызова SendDlgItemMessage это ничтожно малая величина, которой можно пренебречь. при чем пренебрежение в данном случае дает выигрыш 1 байта в размере
А почему ж тогда в большинстве случаев пишут 'xor reg,reg' , а не 'sub reg, reg'. Первый вариант короче?
Ну раз уж тема склонилась в сторону обсуждения быстродействия... То хотел бы спросить =) Что предпочтительней использовать? системные вызовы или функции СИ. К примеру. Системный вызов write или любую СИ функцию, например printf ?... У Стивенса написано, что обращение к системным вызовам более дорогостоющий процесс чем обращение к функциям из стандартной библиотеки... видимо, обычные функции предпочтительней... Вот например printf - тормозная функция.... обращается ли она в конце исполнения к системному вызову write?(в таком случае..естественно очевидно, что её работа будет более долгой чем,вызов write напрямую) чтоб вывести данные на экран.. или выводит как-то ещё?.. без использования ОС... .... Не понятно) от чего отталкиваться в выборе более подходящей функции (по быстродействию)..... как узнать (помимо тестовых программ...) что работает быстрей??
Естественно напрямую вызвать Api функцию будет быстрее. Так как если ты вызываешь printf сишную, то будет получается. (сишная)printf->wsprintf->(сишная)write->(kernel32)WriteFile->(ntdll)ZwWriteFile->(ntoskrnl)ZwWriteFile->(ntoskrnl)NtWriteFile на самом деле там ещё между write и WriteFile ещё переходник(заглушка) стоит
2FED Нельзя сказать, что printf однозначно медленнее write. И там и там будет системный вызов, но за счет буферизации системных вызовов при использовании printf будет меньше, т.к. лучше передать в системный вызов разом 10 байт, чем 10 раз передать по одному байту. printf использует буферизацию, поэтому при передаче данных "кусками" она будет быстрее.
Как сделать так, чтоб происходила буферизация.....при использовании системных вызовов. (без использования стандартной библиотеки Си)