RE FORUM

[REVERSE ENGINEERING] => Programming => Topic started by: eraser on January 26, 2007, 11:18:06 PM

Title: ANSI C ekvivalent ASM kódu
Post by: eraser on January 26, 2007, 11:18:06 PM
Akým spôsobom zapí?em v ANSI C, či prípadne v inom vy??om jazyku nasledovný asm ekvivalent:

Code: [Select]
...
sar eax, 1
jns goto
adc eax, 0
goto:
...


JNS nie je problém, no hor?ie je to s flagom... Register EAX obsahuje 32 bitový signed  (znamienkový) integer.

V podstate ide o to, ako zistiť, či signed aritmetický posuv vpravo, či?e SAR nastavil CF, či?e carry flag.  :(
Title: Re: ANSI C ekvivalent ASM kódu
Post by: Master on January 27, 2007, 09:00:47 AM
v c++
promenna = promenna >> 1
if promenna > 0 //jns ma bejt not sign,tedy kladny nebo nenulovy
   goto: //instrukce za goto

adc je soucet zbytku v cf,tudiz na takove kravinky je opravdu lepsi pouzit asm direktivu primo v c++.Ale podle me ta instrukce v tom v podstate nic nedela.Jestli se nepletu,tak do cf se zapisuje index skoku nebo neskoku,ale nejsem si jisty.
Title: Re: ANSI C ekvivalent ASM kódu
Post by: eraser on January 27, 2007, 01:29:47 PM
Takto som to vyrie?il, či?e pou?il som vkladaný assembler, čoho som sa v?ak chcel vyhnúť kvôli portabilite kódu a tie? nezná?am AT&T asm syntax, ktorú pou?íva lcc kompilátor.

In?trukciu ADC v tomto prípade nemo?no preskočiť, preto?e, ak je nastavený carry flag, čo má za následok vykonanie in?trukcie SAR, či?e ak po SAR EAX, 1 je CF=1, potom sa k registru EAX pripočíta 1 (ADC EAX, 0).
Title: Re: ANSI C ekvivalent ASM kódu
Post by: Master on January 27, 2007, 01:33:48 PM
no vsak samozrejme,proste to je akorat zamaskovany mov.Samotna instrukce jinak nic nedela v tomhle zapisu(adc eax,0)
Title: Re: ANSI C ekvivalent ASM kódu
Post by: eraser on January 27, 2007, 10:24:16 PM
Ako to myslí?, zamaskovaný MOV?

Robí, pripočítava k danému registru CF, ak je teda nastavený na 1 a tento CF mi nastavuje in?trukcia SAR.
Title: Re: ANSI C ekvivalent ASM kódu
Post by: Master on January 28, 2007, 08:08:41 AM
Jo,ale on k tomu nic nepripocitava,takze ta instrukce je tady vlastne mov.Protoze do eax pripocitava nulu + CF.A tim padem to nemeni zadnou hodnotu.
Title: Re: ANSI C ekvivalent ASM kódu
Post by: eraser on January 28, 2007, 12:49:57 PM
Mení to hodnotu. Zoberme si prípad, ?e je v EAX signed hodnota -10 a CF je nastavený na 1. Po zavolaní ADC EAX, 0 bude hodnota v EAX -9.

Celé by sa to dalo popísať takýmto zápisom:

if (CF) EAX++;  // CF = 0/1
Title: Re: ANSI C ekvivalent ASM kódu
Post by: Master on January 28, 2007, 03:10:56 PM
Hmm,je to mozny,ja to nezkousel :) Ale podle toho,co sem si cetl to spis vypadalo na to,co sem rikal ja,ale je to jedno.Hlavne kdyz se pochopi program.
Title: Re: ANSI C ekvivalent ASM kódu
Post by: eraser on January 28, 2007, 04:18:15 PM
No, práve na toto bode sa mi nesprávne generoval key, tak?e som sa na týchto pár in?trukcií zameral bli??ie. Inak som si potom otvoril Rudolf Marek: Učíme se programovat v jazyce Assembler pro PC a zistil som, ?e je tam presný príklad s ADC a operandom 0. Hold, človek pekne rýchlo zabúda, resp. neuvedomuje si niektoré dôle?ité fakty, pokiaľ na ne nenarazí v praxi.
Title: Re: ANSI C ekvivalent ASM kódu
Post by: eraser on January 29, 2007, 01:43:27 PM
Tak u? som na to pri?iel...
Code: [Select]

int ansi_c_sar_adc(int eax)
{
DWORD CF = (DWORD) eax & 1L;

eax >>= 1;

if (eax < 0)
{
eax += CF;
}

return (eax);
}