XOR AX,AX

Det var strax efter millenieskiftet och jag arbetade som IT-konsult i Stockholm. Som för så många andra i branschen hade jag haft samma skrivbord men olika arbetsgivare: först Combitech Network, ett bolag ägt av Saab Aerospace som såldes till Computer Sciences Corporation (CSC), och sedan såldes den verksamhet jag för tillfället arbetade i – Secureguard – till norska Itegra.

Secureguard var distributör för ett antal IT-säkerhetsprodukter och jag var deras produktspecialist. Det var meningen att jag skulle klara av problem som återförsäljarnas installatörer inte klarade av. Det innebar att jag fick åka ut till slutkund, trycka på någon knapp som någon glömt trycka på, bli hjälte och skicka en fet faktura. Det var ett roligt jobb och jag fick besöka allt från serverhallar i bergrum till en kvällstidningsredaktion som var i panik för att ingen kom åt deras hemsida. Den gången var problemet enkelt och jag blev verkligen den där hjälten som gled in, löste allt och gled ut.

Som produktspecialist behövde jag vara certifierad på produkterna i fråga och för att bli det blev jag skickad på allehanda utbildningar. En numera avsomnad produkt var Nokia IP, en brandvägg i form av en låda baserad på BSD och CheckPoint FireWall-1. Sålunda blev jag skickad till Helsingfors för att bli certifierad på Nokia IP.

Jag vill minnas att detta var någon speciell överenskommelse mellan Secureguad och Nokia, så utöver kursen fick jag tid tillsammans med deras främsta specialist på Nokia IP. Jag minns att vi satt i något konferensrum och han ritade på en whiteboard och förklarade. Det var inga svåra saker men han verkade vara smått imponerad av att jag tyckte det var enkelt.

Senare på kvällen insisterade han på att bjuda mig på en utekväll. Det var nog så man gjorde i branschen på den tiden. Min finländske värd verkade väldigt upplagd för en rejäl festkväll, men mitt intresse för alkohol och festande var – och är alltjämt – måttligt. Det började med att han hämtade upp mig med limousine och vi var på åtminstone två olika ställen. På ett av dem var det någon sångerska som sjöng jazz. Jag tyckte det var helt okej men min värd fann det pinsamt dåligt och ville gå därifrån.

Jag i limousintaxi i Helsingfors, 11 april 2000.

Det var under denna kväll som jag förstörde en av min värds anekdoter, en som han tydligen brukade berätta för alla som orkade lyssna. Det var så att en bekant till honom – en briljant programmerare – höll på med en realtidsimplementation baserad på en Intel-processor, en Intel 8086 eller 8088. Poängen i berättelsen var att implementationen var så tidskritisk att vissa instruktioner helt enkelt riskerade att ta för lång tid (de tog upp för många klockcykler).

Programmeraren i min finländske värds berättelse stod nu inför problemet att nollställa ett av mikroprocessorns interna register, men instruktionen MOV AX,0 (flytta värdet 0 till register AX) tog helt enkelt för lång tid. Hur skulle man kunna komma runt detta? Min värd skulle precis presentera lösningen – anekdotens klimax – när jag bröt in:

»Det är ju enkelt: XOR AX,AX

Min värd stirrade på mig en lång stund med halvöppen mun. Sedan sade han att jag förstört hans berättelse och undrade hur jag kunde veta det. Jag måste ju vara lika briljant som hans programmerarkompis!

Poängen här är att XOR är en binär logisk operator där alla bitar som är lika blir 0 och alla som är olika blir 1. XOR AX,AX blir därför garanterat 0, eftersom registret AX jämförs med sig själv och alla bitar alltså är lika. Och XOR AX,AX krävde färre klockcykler än MOV AX,0 och exekverades därför något snabbare.

Men jag var inte briljant. Detta hade jag lärt mig mest av en slump. Jag började med programmering 1986 när min pappa köpte en PC. Den var långsam och trög och därför blev det ett mål att optimera alla program så att de exekverade så snabbt som möjligt. För att verkligen optimera behövde man ibland gå direkt till processorn och programmera assembler, alltså maskinkod i klartext. Och det var när jag suttit och tittat på maskinkod som andra program genererat som jag lade märke till att XOR AX,AX så ofta ersatte MOV AX,0 som jag kollade upp saken och fann att det förra krävde betydligt färre klockcykler.

Det här var alltså ett välkänt knep för att optimera kod som jag råkade känna till. Kanske säger det mer om min värd vars anekdot – som gissningsvis var till för att imponera men kanske inte ens var sann – byggde på att åhöraren inte hade programmerat maskinkod för en Intel 8086.

Kommentarer