· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.UNIX —› приветствуется ли тут обсуждение nasm? вопрос есть

Посл.отвђт Сообщен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