|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 5, 2004 16:14:58 Есть программа, хочу понять, что делает: ; loop.asm ================================================================= global main ; для того, чтобы использовать gcc extern printf ; не понял section .text ; текст программы в ascii msg db "HoodooVoodoo WeedooVoodoo",0Dh,0Ah,0 ; строка типа char, и фиг знает каките три параметра main: ; тело функции mov ecx, 001h ; присваиваю регистру ecx число 1 looper: ; начало цикла push ecx ; что такое функция push push dword msg ; тоже непонятно call printf ; вызываю нечто похожее на printf pop eax ; вызываю какой-то регистр eax pop ecx ; что-то с ним делаю loop looper ; конец цикла ret ; неизвестно что ; EOF ====================================================================== Правильно ли я понимаю строки, которые написал в комментариях? И что значит то что непонял... А вообще хотелось сделать так, чтобы складывались в сумму числа от 0 до 10000 и делилось потом все это на число чисел. Но это не отвечайте. самому понять хочется, как сделать. Спасибо! |
|
|
Дата: Авг 5, 2004 16:19:47 и компилирую shell скриптом
#!/bin/sh
# assemble.sh =========================================================
outfile=${1%%.*}
tempfile=asmtemp.o
nasm -o $tempfile -f elf $1
gcc $tempfile -o $outfile
rm $tempfile -f
#EOF ==================================================================
исполнняю далее ./compile.sh loop.asm; ./loop т.е. что присваивание регистру ecx числа 001h есть число итераций цикла тож ясно. |
|
|
Дата: Авг 5, 2004 18:50:24 global main ;; экспортируемая функция extern printf ;; внешняя функция из libc section .text ;; типа дельше идет код а не данные ; текст программы в ascii msg db "HoodooVoodoo WeedooVoodoo",0Dh,0Ah,0 ; строка типа char, и фиг знает каките три параметра ;; это не параметры - 0Dh,0Ah это перевод каретки, ноль завершает строку main: ; тело функции mov ecx, 001h ;; количество итераций looper: ; начало цикла push ecx ; что такое функция push ;; push не функция а инструкция - сохраняет в стэке значение регистра ecx (ибо вызов внешней функции printf() может его измнить push dword msg ; тоже непонятно ;; положить на стэк адрес строки (это параетр функции printf) call printf ; вызываю нечто похожее на printf ;; причем очень сильно похожее :) pop eax ; вызываю какой-то регистр eax ;; вытаскиваю из стэка 4 байта в регистр eax, но на самом деле это просто сделано для коррекции стэка после вызова функции (удалило адрес строки бывшей параметром функции) pop ecx ; что-то с ним делаю ;; вытаскиваю из стэка сохраненнй ecx loop looper ;; прыгаем на метку looper если ecx > 1 ; конец цикла ret ;; конец функции ну а на С это выглядело бы так: static const char msg[] = "HoodooVoodoo WeedooVoodoo\r\n"; extern "C" printf(char* format, ...); void main() { for ( int i = 1; i > 0; i-- ) { printf(msg); } } |
|
|
Дата: Авг 5, 2004 19:49:41 thx!! |
|
|
Дата: Сен 26, 2004 02:53:31 Чуак просто издевается. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.101 |