1 раз юзаю ассемблер)) у меня была функция которая ксорит строчку по 1 букве. это была она. PHP: function encrypt(str:pchar; len,key:integer):pchar; var i:integer; begin for i:=0 to len do begin str[i]:=Chr(Ord(str[i]) xor key); end; result:=str; end; а это я пытался ее переписать на асме: PHP: function encrypt(str:pchar; len,key:integer):pchar;assembler; asm mov ecx,0 @loop: mov eax,str[ecx] xor eax,key mov str[ecx],eax inc ecx cmp ecx,len jne @loop end; у меня вопрос - что не правильно?) я понимаю, что все, но можно конкретные ошибки выделить тут? //Delphi
procedure encrypt(strchar; len:integer;key:byte); asm pushad mov ebx,str mov ecx,len mov eax,key @cycle: xor byte[ebx],al inc eax loop @cycle popad end;
По-моему, там какая-то ботва была передаваемыми параметрами... В делфе не помню, но в BP7.0 точно надо было пиать типа так: Code: function ttt(a, b:integer); var a1, b1: integer; begin a1 := a; b1 := b; //а в асме уже с а1 и б1 работать...
Надо знать почему и как что возникает, попробуй скомпилировать пример своего кода: Code: function encrypt(str:pchar; len,key:integer):pchar;assembler; asm mov ecx,0 @loop: mov eax,str[ecx] xor eax,key mov str[ecx],eax inc ecx cmp ecx,len jne @loop end; И потрасировать код посмотрев на значения регистров, отладка поможет тебе определить, что правильно, что нет, используй её в будущем, и когда ты научишся грамотно использовать отладчик, и работать в нем, ты сможешь находить ответы на вопросы, а также более серьезные вещи отлаживать. Научись использовать отладчик. например: дельта-смещение, ну это уже вирусы... А под ДОС (имхо) надо программировать, и отладчик поюзать типа TASM+TD, хорошо развивает, на примере: Калашникова - уроков 10-12 и все.
Я кусок сообщения удалил, а это оставил. PS. По твоему для дельты не нужен отладчик? Я имел ввиду, что для всего оссобенно для работы со стеком нужно использовать отладчик. Code: start: Call _Delta _Delta: sub dword ptr [esp], offset _Delta
mov ah,09h mov dx,mesag int 21h mov ah,07h int 21h mov ah,4ch int 21h int 20h mesag db 'OMG$' Мне выводит ♦V☺4♦4♦☺☺☺ ☻***************H♣ц*Т♣¶ ↑ Т♣**** ♣ ═!╦ ┤ ║◄ ═!┤═!┤L═!═ OMG где ошибка?
Объясните мне плиз, что делает этот кусок кода посредине программы на паскале) Чем подробнее, тем лучше, желательно каждую строчку) PHP: Procedure Rotate(D:integer; Var X,Y:integer); Var C,S:integer; X1,Y1:longint; begin if ((X=0) and (Y=0)) or (D=0) then exit; asm mov AX,D mov BX,360 xor CX,CX @m1:sub AX,BX cmp AX,CX jnl @m1 @m2:add AX,BX cmp AX,CX jl @m2 mov BX,90 @m3:cmp AX,BX jl @m4 sub AX,BX inc CX jmp @m3 @m4:sub BX,AX shl AX,1 shl BX,1 Test CL,1 jz @m5 xchg AX,BX @m5:mov SI,AX mov AX,word PTR TableCos[SI] mov C,AX mov AX,word PTR TableCos[BX] mov S,AX cmp CL,1 jl @ex jg @m6 @m7:neg C jmp @ex @m6:neg S cmp CL,3 jl @m7 @ex:end; X1:=longint(X); Y1:=longint(Y); X:=(X1*C-Y1*S) shr 14; Y:=(X1*S+Y1*C) shr 14; end;
табличное определение синуса и косинуса, делается вместо вычисления ,для уменьшения количества тактов процессора для данных процедур.... угол дается в градусах... вычитая по 360 нормируем до индекса Code: mov AX,D ;угол в D mov BX,360 xor CX,CX ;обнуление @m1:sub AX,BX cmp AX,CX jnl @m1 в итоге в ax значение не превышающее 360 градусов операция не искажающая значения синуса и косинуса далее начинаю вычитать квадранты, видимо таблица содержит не все 360 градусов Code: mov BX,90 @m3:cmp AX,BX jl @m4 sub AX,BX inc CX jmp @m3 в cx счетчик квадрантов ... далее получение индексов для таблицы и взятие значений. ... само взятие и запоминание в переменных Code: mov AX,word PTR TableCos[SI] mov C,AX mov AX,word PTR TableCos[BX] mov S,AX
ну к примеру 760 градусов .... вначале вычитаю 400=760-360 операция не изменяет значение синусов и косинусов -40=400-360 а вот угол -40 уже устраивает нас квадрант - это область получающаяся при делении плоскости прямыми X и Y.... их 4-ре штуки в угловом эквиваленте квадрант = 90 градусов ... суть сводится к тому что таблица одна .... а используется так же и для получения синуов на правилах тригонометрии /// если предстоит защита то посмотри матрицу поворота в инете полно описаний
mov dx,stroka+100h ;fasm не знает что такое lea/offset xor bx,bx mov ah,09h int 21h ;нормально выводит строку xor ax,ax mov cx,5 ;первые 5 букв mov si,stroka+100h @cy:lodsb ;буква из stroka -> аккумулятор mov [string+100h],al ; тут он пытается записать букву из stroka в string loop @cy xor ax,ax mov dx,string+100h mov ah,09h int 21h ;тут он выводит бред int 20h stroka db 'aldaskjfahslkdjahlsjdh',13,10,'$',0 string db 80 DUP(?) Программа должна вывести сначал переменную stroka, она ее выводит, а затем должна перегнать ее в переменную string и вывести, но похоже прогша ее тупо не записывает в string. Возможно ли через stosb? //fasm получилось так: mov cx,5 mov si,stroka+100h mov di,string+100h @cy:lodsb stosb loop @cy ................... string db '0000000000000000000000',13,10,'$',0 вопрос: как правильно будет через string dup (?)
Очевидно, что на stroka надо передать смещение в Code: mov dx,string+100h из руководства по fasm Code: lea dx,[bx+si+1] ; load effective address to dx ntldr в официальном мануале все функции описаны, очевидно проблема в не понимании именно синтаксиса фасма. руководство на русском http://www.wasm.ru/baixado.php?mode=doc&id=133
Почему-то не отправляет пакет должен по идее отправлять на 127.0.0.1:80 и еще ответ принимать format PE GUI 4.0 entry start include 'INCLUDE\win32ax.inc' section '.data' data readable writeable sock dd ? wsa WSADATA ; sin sockaddr_in ; hinstance dd ? http db '127.0.0.1',0 buf_sz =100h buf rb buf_sz ht db 'luboi paketeng',13,10,13,10,0 section '.code' code readable executable start: invoke MessageBoxA,0,'asd','asd',0 invoke WSAStartup,101h,wsa cmp eax,0 jne @exit mov [sock],eax invoke inet_addr,http mov [sin.sin_addr],eax mov [sin.sin_family],AF_INET invoke htons,80 mov [sin.sin_port],ax invoke connect,[sock],sin,10h test eax,eax jz @exit invoke send,[sock],ht,26,0 invoke recv,[sock],buf,buf_sz,0 repnz invoke MessageBoxA,0,'yghjk',buf,0 @exit: invoke ExitProcess,0 section '.idata' import data readable writeable library user32,'USER32.DLL',kernel32,'KERNEL32.DLL',wsock,'WS2_32.DLL' import user32,MessageBoxA,'MessageBoxA' import kernel32,ExitProcess,'ExitProcess' import wsock,WSAStartup,'WSAStartup',socket,'socket',recv,'recv',connect,'connect',send,'send',inet_addr,'inet_addr',htons,'htons'
А где ты создаешь сокет Code: SOCKET socket ( int af, int type, int protocol ); Code: invoke socket, AF_INET, SOCK_STREAM, 0 .if eax == INVALID_SOCKET invoke MessageBox 0, 'Could not create socket', 'Error', MB_ICONWARNING mov eax, INVALID_SOCKET ; return error ret .endif mov [sock], eax import user32,MessageBoxA,'MessageBox'