RE FORUM
[REVERSE ENGINEERING] => Programming => Topic started 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:
...
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. :(
-
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.
-
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).
-
no vsak samozrejme,proste to je akorat zamaskovany mov.Samotna instrukce jinak nic nedela v tomhle zapisu(adc eax,0)
-
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.
-
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.
-
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
-
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.
-
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.
-
Tak u? som na to pri?iel...
int ansi_c_sar_adc(int eax)
{
DWORD CF = (DWORD) eax & 1L;
eax >>= 1;
if (eax < 0)
{
eax += CF;
}
return (eax);
}