Author Topic: ANSI C ekvivalent ASM kódu  (Read 783 times)

eraser

  • repe cmpsb
  • Senior Member
  • ****
  • Posts: 268
  • Kill malware!
ANSI C ekvivalent ASM kódu
« 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.  :(
th3 r341 f4!1ur3 !5 wh3n y0u d0n't 134rn 4nyth!n6 fr0m 4ny 6!v3n 5!tu4t!0n
the real failure is when you don't learn anything from any given situation

Master

  • [t4C]newbie child
  • VIP
  • *****
  • Posts: 615
Re: ANSI C ekvivalent ASM kódu
« Reply #1 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.

eraser

  • repe cmpsb
  • Senior Member
  • ****
  • Posts: 268
  • Kill malware!
Re: ANSI C ekvivalent ASM kódu
« Reply #2 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).
th3 r341 f4!1ur3 !5 wh3n y0u d0n't 134rn 4nyth!n6 fr0m 4ny 6!v3n 5!tu4t!0n
the real failure is when you don't learn anything from any given situation

Master

  • [t4C]newbie child
  • VIP
  • *****
  • Posts: 615
Re: ANSI C ekvivalent ASM kódu
« Reply #3 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)

eraser

  • repe cmpsb
  • Senior Member
  • ****
  • Posts: 268
  • Kill malware!
Re: ANSI C ekvivalent ASM kódu
« Reply #4 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.
th3 r341 f4!1ur3 !5 wh3n y0u d0n't 134rn 4nyth!n6 fr0m 4ny 6!v3n 5!tu4t!0n
the real failure is when you don't learn anything from any given situation

Master

  • [t4C]newbie child
  • VIP
  • *****
  • Posts: 615
Re: ANSI C ekvivalent ASM kódu
« Reply #5 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.

eraser

  • repe cmpsb
  • Senior Member
  • ****
  • Posts: 268
  • Kill malware!
Re: ANSI C ekvivalent ASM kódu
« Reply #6 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
th3 r341 f4!1ur3 !5 wh3n y0u d0n't 134rn 4nyth!n6 fr0m 4ny 6!v3n 5!tu4t!0n
the real failure is when you don't learn anything from any given situation

Master

  • [t4C]newbie child
  • VIP
  • *****
  • Posts: 615
Re: ANSI C ekvivalent ASM kódu
« Reply #7 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.

eraser

  • repe cmpsb
  • Senior Member
  • ****
  • Posts: 268
  • Kill malware!
Re: ANSI C ekvivalent ASM kódu
« Reply #8 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.
th3 r341 f4!1ur3 !5 wh3n y0u d0n't 134rn 4nyth!n6 fr0m 4ny 6!v3n 5!tu4t!0n
the real failure is when you don't learn anything from any given situation

eraser

  • repe cmpsb
  • Senior Member
  • ****
  • Posts: 268
  • Kill malware!
Re: ANSI C ekvivalent ASM kódu
« Reply #9 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);
}
th3 r341 f4!1ur3 !5 wh3n y0u d0n't 134rn 4nyth!n6 fr0m 4ny 6!v3n 5!tu4t!0n
the real failure is when you don't learn anything from any given situation