Ligiu Uiorean - Home: https://uiorean.com/ - Posts: https://uiorean.com/posts/ - Bani publici, cod public: am analizat inițiativa legislativă privind codul sursă deschis în sectorul public.: https://uiorean.com/posts/2026-07-01-bani-publici-cod-public-analiza-legii-codului-sursa-deschis/ - Two things airports get wrong about replacing an AODB.: https://uiorean.com/posts/2026-06-30-two-things-airports-get-wrong-about-replacing-an-aodb/ - LOFIC sensors and the promise of huge dynamic range: https://uiorean.com/posts/2026-06-29-lofic-sensors-and-dynamic-range/ - My mom asked me if AI is going to affect us.: https://uiorean.com/posts/2026-06-29-my-mom-asked-me-if-ai-is-going-to-affect-us/ - We are working through the design of a new performance-linked bonus at AirportLabs.: https://uiorean.com/posts/2026-06-25-we-are-working-through-the-design-of-a-new-performance/ - Division of Labour in the Time of AI: https://uiorean.com/posts/2026-06-22-division-of-labour-in-the-time-of-ai/ - My son finished kindergarten today.: https://uiorean.com/posts/2026-06-19-my-son-finished-kindergarten-today/ - Two months ago I wrote: vendor-managed AI degrades silently.: https://uiorean.com/posts/2026-06-16-two-months-ago-i-wrote-vendor-managed-ai-degrades-silently/ - The most uncomfortable number in aviation this year is not in the profit forecast.: https://uiorean.com/posts/2026-06-15-the-most-uncomfortable-number-in-aviation-this-year-is-not/ - I was in Paris with my family the other week.: https://uiorean.com/posts/2026-06-13-i-was-in-paris-with-my-family-the-other-week/ - The FIDS (Flight Information Dissemination System) should present the most relevant Information for passengers at each touchpoint.: https://uiorean.com/posts/2026-06-11-the-fids-flight-information-dissemination-system-should/ - What is an acquisition?: https://uiorean.com/posts/2026-06-10-what-is-an-acquisition/ - Brilliant showcase of the AirportLabs RealTime platform, proudly running at DOH: https://lnkd.in/du79DGZy: https://uiorean.com/posts/2026-05-13-brilliant-showcase-of-the-airportlabs-realtime-platform/ - A customer told me, recently, that he was told gate allocation at an airport is rather like playing Tetris.: https://uiorean.com/posts/2026-05-07-a-customer-told-me-recently-that-he-was-told-gate/ - You watch the news.: https://uiorean.com/posts/2026-05-05-you-watch-the-news/ - 𝐓𝐡𝐞 𝐪𝐮𝐞𝐬𝐭𝐢𝐨𝐧 𝐢𝐬 𝐧𝐨 𝐥𝐨𝐧𝐠𝐞𝐫 "𝐢𝐬 𝐭𝐡𝐞 𝐀𝐈 𝐮𝐩?" 𝐈𝐭 𝐢𝐬 "𝐢𝐬 𝐭𝐡𝐞 𝐀𝐈 𝐬𝐭𝐢𝐥𝐥 𝐝𝐨𝐢𝐧𝐠 𝐰𝐡𝐚𝐭 𝐢𝐭 𝐮𝐬𝐞𝐝 𝐭𝐨 𝐝𝐨?": https://uiorean.com/posts/2026-04-28-the-question-is-no-longer-is-the-ai-up-it-is-is-the-ai/ - Our BA interns did not spend their first weeks in a training room.: https://uiorean.com/posts/2026-04-23-our-ba-interns-did-not-spend-their-first-weeks-in-a/ - A "Black Swan" used to be the rare event that reshaped a season.: https://uiorean.com/posts/2026-04-22-a-black-swan-used-to-be-the-rare-event-that-reshaped-a/ - Boston Consulting Group (BCG) just published one of the clearest articulations of where leading airports are headed, and it is the model that AirportLabs customers are already running.: https://uiorean.com/posts/2026-04-21-boston-consulting-group-bcg-just-published-one-of-the/ - Fraport Greece deployed the AirportLabs Community App across their entire Greek network in four months:: https://uiorean.com/posts/2026-04-20-fraport-greece-deployed-the-airportlabs-community-app/ - ACI Just Confirmed: AirportLabs runs the World's Busiest Airport: https://uiorean.com/posts/2026-04-15-aci-just-confirmed-airportlabs-runs-the-world-s-busiest/ - Setting the pace in the industry and on the track. Inspiring work!: https://uiorean.com/posts/2026-04-03-setting-the-pace-in-the-industry-and-on-the-track-inspiring/ - I think energy price arbitrage through AI load shifting is going to be a real business.: https://uiorean.com/posts/2026-04-03-i-think-energy-price-arbitrage-through-ai-load-shifting-is/ - Weird weekend flex from the AirportLabs SkyCore AODB team.: https://uiorean.com/posts/2026-03-27-weird-weekend-flex-from-the-airportlabs-skycore-aodb-team/ - Tocmai am revenit de la PTE după anul cel mai încărcat de până acum.: https://uiorean.com/posts/2026-03-26-tocmai-am-revenit-de-la-pte-dupa-anul-cel-mai-incarcat-de/ - Speed creates opportunities.: https://uiorean.com/posts/2026-03-24-speed-creates-opportunities/ - Emil Boc e cel puțin incompetent și incompetența lui ne omoară.: https://uiorean.com/posts/2026-03-20-emil-boc-e-cel-putin-incompetent-si-incompetenta-lui-ne/ - So - at PTE 2025 we announced the contract, went live by August and this PTE the team is ready to discuss how we achieve faster time to value for airports.: https://uiorean.com/posts/2026-03-16-so-at-pte-2025-we-announced-the-contract-went-live-by/ - The weekend is when I remember that airports don’t care it’s Saturday.: https://uiorean.com/posts/2026-03-13-the-weekend-is-when-i-remember-that-airports-don-t-care-it/ - Aviation does not have time for 2-year software projects.: https://uiorean.com/posts/2026-03-12-aviation-does-not-have-time-for-2-year-software-projects/ - Following the recent events in the Middle East, I watched the AirportLabs team step up with a level of commitment that honestly blew me away.: https://uiorean.com/posts/2026-03-11-following-the-recent-events-in-the-middle-east-i-watched/ - A lot of airport tech still assumes that if the system knows something, the airport knows it.: https://uiorean.com/posts/2026-03-10-a-lot-of-airport-tech-still-assumes-that-if-the-system/ - Infinitely scalable.": https://uiorean.com/posts/2026-03-09-infinitely-scalable/ - To recap this roller-coaster week: it was a reminder that “the cloud” is still made of buildings, cables and people on the ground.: https://uiorean.com/posts/2026-03-06-to-recap-this-roller-coaster-week-it-was-a-reminder-that/ - Pentru prima dată într-un studiu din România, motivația principală a angajaților nu mai e salariul.: https://uiorean.com/posts/2026-03-05-pentru-prima-data-intr-un-studiu-din-romania-motivatia/ - I always thought (and hoped) "battle tested" would ONLY mean that our systems are proven in operation.: https://uiorean.com/posts/2026-03-04-i-always-thought-and-hoped-battle-tested-would-only-mean/ - An airport has a fixed number of gates, stands, check-in desks, baggage belts, and jet bridges.: https://uiorean.com/posts/2026-03-03-an-airport-has-a-fixed-number-of-gates-stands-check-in/ - Happy Mărțișor! 🌸: https://uiorean.com/posts/2026-03-02-happy-martisor/ - The "Cloud" is still physical.: https://uiorean.com/posts/2026-03-02-the-cloud-is-still-physical/ - We know how much is being asked of everyone in the region right now.: https://uiorean.com/posts/2026-02-28-we-know-how-much-is-being-asked-of-everyone-in-the-region/ - Airlines that went all-in on one engine option for the A320neo have spent years dealing with groundings, lost capacity, and repair backlogs.: https://uiorean.com/posts/2026-02-27-airlines-that-went-all-in-on-one-engine-option-for-the/ - Apparently there's a tension in tech right now: companies are adopting AI fast, and at the same time cutting the pipeline of junior talent.: https://uiorean.com/posts/2026-02-26-apparently-there-s-a-tension-in-tech-right-now-companies/ - Airports are spending more on IT, but many still aren’t satisfied with the results.: https://uiorean.com/posts/2026-02-25-airports-are-spending-more-on-it-but-many-still-aren-t/ - McKinsey & Company’s research on smart airports is clear: the right integration and digital solutions can boost airport EBITDA by 6-8%, with much of that gain achievable within a few years.: https://uiorean.com/posts/2026-02-24-mckinsey-company-s-research-on-smart-airports-is-clear-the/ - Pilots that never land: https://uiorean.com/posts/2026-02-23-pilots-that-never-land/ - Cei mai buni colegi au ajuns la noi prin programe de internship.: https://uiorean.com/posts/2026-02-21-cei-mai-buni-colegi-au-ajuns-la-noi-prin-programe-de/ - “Why is your stand so big?”: https://uiorean.com/posts/2026-02-20-why-is-your-stand-so-big/ - Nu am mai deschis o poziție de acest fel de 4 ani.: https://uiorean.com/posts/2026-02-06-nu-am-mai-deschis-o-pozitie-de-acest-fel-de-4-ani/ - Fast deployment deserves a fast deep-dive.: https://uiorean.com/posts/2026-02-05-fast-deployment-deserves-a-fast-deep-dive/ - Heading into the weekend with some great news from Mexico! 🇲🇽: https://uiorean.com/posts/2026-01-30-heading-into-the-weekend-with-some-great-news-from-mexico/ - Why do the world’s biggest operations trust AirportLabs Allegra RMS?: https://uiorean.com/posts/2026-01-29-why-do-the-world-s-biggest-operations-trust-airportlabs/ - Inside the Brain of the World’s Busiest International Airport ✈️🧠: https://uiorean.com/posts/2026-01-22-inside-the-brain-of-the-world-s-busiest-international/ - It’s one thing to be a large airport; it’s another to operate with the efficiency required to be Number 1.: https://uiorean.com/posts/2026-01-21-it-s-one-thing-to-be-a-large-airport-it-s-another-to/ - 1 Million Workflows. Zero Paperwork.: https://uiorean.com/posts/2026-01-20-1-million-workflows-zero-paperwork/ - Watching the AirportLabs "Wrapped" video, I’m struck by one thing: Momentum.: https://uiorean.com/posts/2025-12-23-watching-the-airportlabs-wrapped-video-i-m-struck-by-one/ - For all Cluj people, AirportLabs will be participating in an open doors event that is becoming a tradition here.: https://uiorean.com/posts/2025-10-14-for-all-cluj-people-airportlabs-will-be-participating-in-an/ - Another year, another AirportLabs team running event in the books!: https://uiorean.com/posts/2025-09-21-another-year-another-airportlabs-team-running-event-in-the/ - Three years ago, we started the AirportLabs Online Learning Academy.: https://uiorean.com/posts/2025-08-27-three-years-ago-we-started-the-airportlabs-online-learning/ - This is what partnership looks like.: https://uiorean.com/posts/2025-08-26-this-is-what-partnership-looks-like/ - Absolutely thrilled and immensely proud to share that AirportLabs has won a Skift IDEA Award for 2025 for our Airport Community App!: https://uiorean.com/posts/2025-08-12-absolutely-thrilled-and-immensely-proud-to-share-that/ - Untold nu aduce prosperitate: https://uiorean.com/posts/2025-08-08-untold-nu-aduce-prosperitate/ - An de an, auzim aceeași poveste, susținută fără rușine inclusiv de primar: Untold aduce prosperitate economică în Cluj-Napoca.: https://uiorean.com/posts/2025-08-07-an-de-an-auzim-aceeasi-poveste-sustinuta-fara-rusine/ - For engineers who thrive on technical challenges: Alexandra Moca is seeking new members for her team at AirportLabs.: https://uiorean.com/posts/2025-08-06-for-engineers-who-thrive-on-technical-challenges-alexandra/ - 2 Million Strong: AirportLabs Community App - the People and Data Platform That's Moving Aviation!: https://uiorean.com/posts/2025-08-05-2-million-strong-airportlabs-community-app-the-people-and/ - Yesterday's technical issue at the Swanwick Centre put UK air traffic operations to the test.: https://uiorean.com/posts/2025-07-31-yesterday-s-technical-issue-at-the-swanwick-centre-put-uk/ - It takes a global community to keep the world's airports running smoothly, and a huge part of that community is connected through the AirportLabs Airport Community App.: https://uiorean.com/posts/2025-07-18-it-takes-a-global-community-to-keep-the-world-s-airports/ - Ever notice how airports and airlines start telling you about your flight experience long before you even board?: https://uiorean.com/posts/2025-07-09-ever-notice-how-airports-and-airlines-start-telling-you/ - Are You Tracking Your 'Time To Wow'?: https://uiorean.com/posts/2025-07-07-are-you-tracking-your-time-to-wow/ - See our products live!: https://uiorean.com/posts/2025-07-04-see-our-products-live/ - Officially, it was a celebration of 10 years of innovation.: https://uiorean.com/posts/2025-07-04-officially-it-was-a-celebration-of-10-years-of-innovation/ - We do not see reality, we see our reality: https://uiorean.com/posts/2025-06-26-we-do-not-see-reality-we-see-our-reality/ - ✈️ Airports are emotional environments — not just logistical ones.: https://uiorean.com/posts/2025-06-24-airports-are-emotional-environments-not-just-logistical-ones/ - At the beginning of the year I said we will be activating an airport a week this year.: https://uiorean.com/posts/2025-06-20-at-the-beginning-of-the-year-i-said-we-will-be-activating/ - ....a partner who never blinked – AirportLabs": https://uiorean.com/posts/2025-06-03-a-partner-who-never-blinked-airportlabs/ - 🇷🇴🇷🇴🇷🇴: https://uiorean.com/posts/2025-05-18-post/ - Intern to department head in 5.5 years?: https://uiorean.com/posts/2025-05-08-intern-to-department-head-in-5-5-years/ - We're hiring a DevOps engineer for our Cluj office.: https://uiorean.com/posts/2025-05-07-we-re-hiring-a-devops-engineer-for-our-cluj-office/ - 🇷🇴🇷🇴🇷🇴: https://uiorean.com/posts/2025-05-03-post/ - At least 50% of the world's busiest airports (by intl.: https://uiorean.com/posts/2025-04-16-at-least-50-of-the-world-s-busiest-airports-by-intl/ - International Gate Control (IGC)has chosen AirportLabs —proven in the world’s largest and most complex airports—to elevate operations at Chicago O’Hare International Airport!: https://uiorean.com/posts/2025-04-10-international-gate-control-igc-has-chosen-airportlabs/ - Thrilled to announce a paradigm shift in the aviation tech industry! 🚀: https://uiorean.com/posts/2025-04-01-thrilled-to-announce-a-paradigm-shift-in-the-aviation-tech/ - The increasing global focus on tech sovereignty highlights the strategic importance of infrastructure independence, particularly for providers of critical services.: https://uiorean.com/posts/2025-03-24-the-increasing-global-focus-on-tech-sovereignty-highlights/ - Over 2.5M messages were pushed out this morning over the AirportLabs Community App regarding the flights disruption in the London area.: https://uiorean.com/posts/2025-03-21-over-2-5m-messages-were-pushed-out-this-morning-over-the/ - As AirportLabs turned 10, I’ve been thinking this morning about the moments that have truly defined us.: https://uiorean.com/posts/2025-03-08-as-airportlabs-turned-10-i-ve-been-thinking-this-morning/ - I usually steer clear of mainstream news and hype, but the recent wave of disruption caused by DeepSeek in the stock market is too impressive to ignore.: https://uiorean.com/posts/2025-01-28-i-usually-steer-clear-of-mainstream-news-and-hype-but-the/ - We just had one month with 0 critical incidents across hundreds of production systems.: https://uiorean.com/posts/2025-01-13-we-just-had-one-month-with-0-critical-incidents-across/ - Hey David LAVOREL Anamaria Beleiu did you really name your Cluj Office AirportLab?: https://uiorean.com/posts/2025-01-07-hey-david-lavorel-anamaria-beleiu-did-you-really-name-your/ - 🎉 Celebrating 10 Years of AirportLabs! 🎉: https://uiorean.com/posts/2025-01-05-celebrating-10-years-of-airportlabs/ - My last post about the need for 99.99% system availability in airports generated a lot of buzz – both within the aviation industry and beyond.: https://uiorean.com/posts/2024-12-13-my-last-post-about-the-need-for-99-99-system-availability/ - At AirportLabs, we live and breathe aviation high technology.: https://uiorean.com/posts/2024-12-06-at-airportlabs-we-live-and-breathe-aviation-high-technology/ - Been geeking out with the AirportLabs team over various companies' annual reports lately.: https://uiorean.com/posts/2024-11-29-been-geeking-out-with-the-airportlabs-team-over-various/ - One thing that AirportLabs may have triggered over the past 10 years is the change in system availability requirements in tenders.: https://uiorean.com/posts/2024-11-22-one-thing-that-airportlabs-may-have-triggered-over-the-past/ - At AirportLabs, we've spent the last decade transforming airports into dynamic, responsive hubs.: https://uiorean.com/posts/2024-11-15-at-airportlabs-we-ve-spent-the-last-decade-transforming/ - 10 years ago, I made a risky bet for AirportLabs: we built EVERYTHING in-house.: https://uiorean.com/posts/2024-11-08-10-years-ago-i-made-a-risky-bet-for-airportlabs-we-built/ - Nine years ago, when we first presented the 'Report a Fault' feature in the AirportLabs Airport Community App, an airport executive looked at me skeptically.: https://uiorean.com/posts/2024-11-01-nine-years-ago-when-we-first-presented-the-report-a-fault/ - It's been almost 9 years since AirportLabs launched the Airport Community App and I've just noticed that now we send over 40 million push notifications per month.: https://uiorean.com/posts/2024-10-25-it-s-been-almost-9-years-since-airportlabs-launched-the/ - The Red Dot Design Award certificate has landed just as we're about to on-board our 10th SkyCore customer!: https://uiorean.com/posts/2024-10-18-the-red-dot-design-award-certificate-has-landed-just-as-we/ - At AirportLabs we invest heavily in user interfaces, but for an AODB, a UI can actually be a sign of lack of automation.: https://uiorean.com/posts/2024-10-09-at-airportlabs-we-invest-heavily-in-user-interfaces-but-for/ - Forget code sprints, we just did a literal sprint! 🏃‍♀️: https://uiorean.com/posts/2024-09-22-forget-code-sprints-we-just-did-a-literal-sprint/ - What an incredible journey it's been!: https://uiorean.com/posts/2024-09-20-what-an-incredible-journey-it-s-been/ - Red Dot?: https://uiorean.com/posts/2024-09-05-red-dot/ - If your airport staff spends more time fighting with their software than actually working, it's time for an upgrade.: https://uiorean.com/posts/2024-08-30-if-your-airport-staff-spends-more-time-fighting-with-their/ - Behind every seamless airport experience is a team empowered by great design.: https://uiorean.com/posts/2024-08-29-behind-every-seamless-airport-experience-is-a-team/ - I've always been drawn to innovative management concepts.: https://uiorean.com/posts/2024-08-09-i-ve-always-been-drawn-to-innovative-management-concepts/ - AirportLabs' "unmeasured time off" policy is a shining example of how companies can empower employees and drive results.: https://uiorean.com/posts/2024-08-05-airportlabs-unmeasured-time-off-policy-is-a-shining-example/ - I believe the days of ugly, clunky corporate software should be over.: https://uiorean.com/posts/2024-07-31-i-believe-the-days-of-ugly-clunky-corporate-software-should/ - We're hearing about tonight's Azure and DigiCert incidents.: https://uiorean.com/posts/2024-07-30-we-re-hearing-about-tonight-s-azure-and-digicert-incidents/ - ✈️🛫 Calling all Senior Backend Developers! 🛫✈️: https://uiorean.com/posts/2024-07-26-calling-all-senior-backend-developers/ - In the fast-paced world of aviation SaaS, talent is a prized asset.: https://uiorean.com/posts/2024-07-24-in-the-fast-paced-world-of-aviation-saas-talent-is-a-prized/ - Tough day for aviation and IT and as many of you may know, I'm always on top of events that impact our customers.: https://uiorean.com/posts/2024-07-19-tough-day-for-aviation-and-it-and-as-many-of-you-may-know-i/ - Throwback to that time I tried to inspire the public...: https://uiorean.com/posts/2024-07-05-throwback-to-that-time-i-tried-to-inspire-the-public/ - 🎉 Congrats to the amazing team at AirportLabs on the launch of PocketFlights!: https://uiorean.com/posts/2024-06-07-congrats-to-the-amazing-team-at-airportlabs-on-the-launch/ - At the Dubai Airport Show, I had an incredible opportunity to meet a true leader in UAE aviation, HH Sheikh Ahmed bin Saeed Al Maktoum.: https://uiorean.com/posts/2024-05-14-at-the-dubai-airport-show-i-had-an-incredible-opportunity/ - So excited to see Ioana speak at the Dubai Airport Show!: https://uiorean.com/posts/2024-05-10-so-excited-to-see-ioana-speak-at-the-dubai-airport-show/ - Excited to announce that AirportLabs will be attending Passenger Terminal Expo in Frankfurt (April 16-18)!: https://uiorean.com/posts/2024-03-18-excited-to-announce-that-airportlabs-will-be-attending/ - Impressive view of AirportLabs' RealTime passenger flow in action!: https://uiorean.com/posts/2024-03-09-impressive-view-of-airportlabs-realtime-passenger-flow-in/ - Happy International Women's Day!: https://uiorean.com/posts/2024-03-08-happy-international-women-s-day/ - 🇯🇵🇯🇵🇯🇵 Welcome Japan!: https://uiorean.com/posts/2024-02-13-welcome-japan/ - I will be holding a presentation and Q&A session on the 15th of Feb.: https://uiorean.com/posts/2024-02-09-i-will-be-holding-a-presentation-and-q-a-session-on-the/ - Excited to share a project close to my heart - working together towards greater accessibility in travel for passengers with reduced mobility.: https://uiorean.com/posts/2024-02-05-excited-to-share-a-project-close-to-my-heart-working/ - What a fantastic year it's been in AirportLabs!: https://uiorean.com/posts/2023-12-20-what-a-fantastic-year-it-s-been-in-airportlabs/ - When your office has its very own Harvey Specter, you know the digital transformation talk is about to get as sharp as his suits.: https://uiorean.com/posts/2023-12-18-when-your-office-has-its-very-own-harvey-specter-you-know/ - Our team is mostly complete and high performing but this is a rare occasion when we're #hiring junior/mid in our product team.: https://uiorean.com/posts/2023-10-21-our-team-is-mostly-complete-and-high-performing-but-this-is/ - I've noticed that the disaster recovery requirements stipulated in contracts often demand service recovery within 24h.: https://uiorean.com/posts/2023-10-09-i-ve-noticed-that-the-disaster-recovery-requirements/ - I'll be holding a keynote speech at the World Aviation Festival in Lisbon.: https://uiorean.com/posts/2023-09-22-i-ll-be-holding-a-keynote-speech-at-the-world-aviation/ - Exciting news from AirportLabs!: https://uiorean.com/posts/2023-09-15-exciting-news-from-airportlabs/ - Conway's law posits that software often mirrors the structures of the organizations that create it.: https://uiorean.com/posts/2023-09-15-conway-s-law-posits-that-software-often-mirrors-the/ - Many airports fear that having critical systems in the cloud may pose a risk in case all Internet links are lost.: https://uiorean.com/posts/2023-09-13-many-airports-fear-that-having-critical-systems-in-the/ - Super proud of this one: AirportLabs can run its entire product lineup on any cloud and across multiple clouds, including private and bare metal infrastructure.: https://uiorean.com/posts/2023-09-11-super-proud-of-this-one-airportlabs-can-run-its-entire/ - First in a series of articles I coauthored, on how we build our products in AirportLabs: https://uiorean.com/posts/2023-09-08-first-in-a-series-of-articles-i-coauthored-on-how-we-build/ - The Community App team at AirportLabs wrote a review of how the app was used during yesterday's nation wide air traffic control system failure in the UK.: https://uiorean.com/posts/2023-08-29-the-community-app-team-at-airportlabs-wrote-a-review-of-how/ - Read about the powerhouse behind the AirportLabs product suite - our planet scale integration engine - the AirportLabs Data Router.: https://uiorean.com/posts/2023-08-28-read-about-the-powerhouse-behind-the-airportlabs-product/ - In the past, business software often received minimal investment in UI/UX due to its limited evaluation in tenders, and end users had limited points of comparison.: https://uiorean.com/posts/2023-08-22-in-the-past-business-software-often-received-minimal/ - Dive into the pages of our inaugural post from an ongoing series spotlighting our products, technology, and the vibrant pulse of life within AirportLabs: https://uiorean.com/posts/2023-08-21-dive-into-the-pages-of-our-inaugural-post-from-an-ongoing/ - We've just had a cool team outing at AirportLabs & our bi-annual Peer Bonus Points session: https://uiorean.com/posts/2023-07-14-we-ve-just-had-a-cool-team-outing-at-airportlabs-our-bi/ - It's great to witness AirportLabs making a notable entrance into the public eye and actively engaging with the international aviation and tech community!: https://uiorean.com/posts/2023-07-07-it-s-great-to-witness-airportlabs-making-a-notable-entrance/ - I am humbled and proud to be part of such an exceptional team.: https://uiorean.com/posts/2023-06-19-i-am-humbled-and-proud-to-be-part-of-such-an-exceptional/ - Great way to end the week - AirportLabs Airport Community App launched in New York's airport system!: https://uiorean.com/posts/2023-05-12-great-way-to-end-the-week-airportlabs-airport-community-app/ - Building a company is incredibly hard and can only be achieved by lots of hard work and passion: https://uiorean.com/posts/2023-04-03-building-a-company-is-incredibly-hard-and-can-only-be/ - Heading towards #PTExpoConf in Amsterdam.: https://uiorean.com/posts/2023-03-10-heading-towards-ptexpoconf-in-amsterdam/ - Yesterday's global outage of the Lufthansa systems caught me with the entire family waiting for a LH flight in Munich Airport.: https://uiorean.com/posts/2023-02-16-yesterday-s-global-outage-of-the-lufthansa-systems-caught/ - Diseară voi schimba idei cu studenții de la FSEGA despre cum se construiesc companii.: https://uiorean.com/posts/2023-01-19-diseara-voi-schimba-idei-cu-studentii-de-la-fsega-despre/ - AirportLabs is 8 today and I thought it’s a good time to look at where we’ve been and think of where we’re heading.: https://uiorean.com/posts/2023-01-05-airportlabs-is-8-today-and-i-thought-it-s-a-good-time-to/ - ⚽⚽⚽ Do you have to travel during great sport events?: https://uiorean.com/posts/2022-11-10-do-you-have-to-travel-during-great-sport-events/ - AirportLabs just opened a new senior role in our Cluj office - do you know anyone interested?: https://uiorean.com/posts/2022-09-26-airportlabs-just-opened-a-new-senior-role-in-our-cluj/ - Super stoked when we get feedback like this, congrats to our partner airports and the AirportLabs VisionAir FIDS team!: https://uiorean.com/posts/2022-09-20-super-stoked-when-we-get-feedback-like-this-congrats-to-our/ - Avem un rol nou deschis în Cluj.: https://uiorean.com/posts/2022-07-19-avem-un-rol-nou-deschis-in-cluj/ - Congratulations AirportLabs team for a very successful first half of the year!: https://uiorean.com/posts/2022-07-13-congratulations-airportlabs-team-for-a-very-successful/ - Mulțumesc Andreea Rosca pentru acest interviu, sper că am reușit să adaug valoare pentru publicul tău!: https://uiorean.com/posts/2022-05-27-multumesc-andreea-rosca-pentru-acest-interviu-sper-ca-am/ - Hey, we can run more than just airport systems!: https://uiorean.com/posts/2022-05-23-hey-we-can-run-more-than-just-airport-systems/ - It's internship season once again!: https://uiorean.com/posts/2022-05-03-it-s-internship-season-once-again/ - We have recently completed our profit share round of almost €300.000.: https://uiorean.com/posts/2022-04-22-we-have-recently-completed-our-profit-share-round-of-almost/ - On International Women's day I'd like to express my gratitude to all the women that I am lucky to surround myself with.: https://uiorean.com/posts/2022-03-08-on-international-women-s-day-i-d-like-to-express-my/ - Happy to see one of our team's innovations in the space of airport efficiency is gaining traction!: https://uiorean.com/posts/2022-03-03-happy-to-see-one-of-our-team-s-innovations-in-the-space-of/ - As storm Eunice is making a landfall in Europe we're already seeing a 2x-3x increase in use of the Community App.: https://uiorean.com/posts/2022-02-18-as-storm-eunice-is-making-a-landfall-in-europe-we-re/ - Hiring for our devops team!: https://uiorean.com/posts/2022-01-31-hiring-for-our-devops-team/ - So excited to see Alexandra Moca's presentation tonight - you might remember her from our internship videos a few years back.: https://uiorean.com/posts/2022-01-27-so-excited-to-see-alexandra-moca-s-presentation-tonight-you/ - Sorry network - this is in Romanian and of local relevance only.: https://uiorean.com/posts/2022-01-19-sorry-network-this-is-in-romanian-and-of-local-relevance/ - Many years ago I was working on the client side (i.e.: https://uiorean.com/posts/2022-01-05-many-years-ago-i-was-working-on-the-client-side-i-e/ - More than twice a second (on average) but sometimes 50 times per second (during major events)...: https://uiorean.com/posts/2022-01-03-more-than-twice-a-second-on-average-but-sometimes-50-times/ - AirportLabs has barely reached school age and some consultants think it already deserves to hang out with the grandparents of the industry – as a key player 😁: https://uiorean.com/posts/2021-12-27-airportlabs-has-barely-reached-school-age-and-some/ - Now you can make sure SANTA1 has everything it needs for visual approach and watch the landing in real time 🦌🦌🦌: https://uiorean.com/posts/2021-12-20-now-you-can-make-sure-santa1-has-everything-it-needs-for/ - The Airport Community App was launched in production 6 years ago.: https://uiorean.com/posts/2021-12-01-the-airport-community-app-was-launched-in-production-6/ - New paid internship starting this September!: https://uiorean.com/posts/2021-07-30-new-paid-internship-starting-this-september/ - AirportLabs is super excited to see our partner DXB's Terminal 1 lights back on!: https://uiorean.com/posts/2021-06-24-airportlabs-is-super-excited-to-see-our-partner-dxb-s/ - Cloud airport systems make cutting edge solutions available and affordable even for the smallest of airports while also allowing the largest of airports to stay nimble and get the latest features fast.: https://uiorean.com/posts/2021-04-23-cloud-airport-systems-make-cutting-edge-solutions-available/ - On International Women's Day, we want to take a moment to celebrate all the women in our lives, whether professional or personal.: https://uiorean.com/posts/2021-03-08-on-international-women-s-day-we-want-to-take-a-moment-to/ - New roles available in AirportLabs Cluj - Improve the life of billions of passengers worldwide!: https://uiorean.com/posts/2021-01-11-new-roles-available-in-airportlabs-cluj-improve-the-life-of/ - Hey network - wish you were here with us!: https://uiorean.com/posts/2020-12-17-hey-network-wish-you-were-here-with-us/ - DevOps role opening for our Cluj Office - improve the life of billions of passengers !: https://uiorean.com/posts/2020-12-14-devops-role-opening-for-our-cluj-office-improve-the-life-of/ - Looking for a DevOps/SRE for our Cluj office, to work with the best in the industry!: https://uiorean.com/posts/2020-12-03-looking-for-a-devops-sre-for-our-cluj-office-to-work-with/ - A new opportunity at our Cluj office - Frontend Developer to work with the best in the industry!: https://uiorean.com/posts/2020-11-27-a-new-opportunity-at-our-cluj-office-frontend-developer-to/ - Dubai' The Model Centre has produced and impressive study regarding the journey and impact of adopting Community App in Dubai's airports.: https://uiorean.com/posts/2020-03-07-dubai-the-model-centre-has-produced-and-impressive-study/ - Excited to see multiple AirportLabs products featured in DA's CEO report for the third year in a row!: https://uiorean.com/posts/2020-02-05-excited-to-see-multiple-airportlabs-products-featured-in-da/ - Dubai Airports CEO mentions AirportLabs RealTime and Community App in his update on the progress in the first half of 2019!: https://uiorean.com/posts/2019-09-04-dubai-airports-ceo-mentions-airportlabs-realtime-and/ - On the UAE's 43rd anniversary: https://uiorean.com/posts/2014-12-02-on-the-uae-43rd-anniversary/ - Scrutiny and made-up numbers: https://uiorean.com/posts/2012-10-11-scrutiny-and-made-up-numbers/ - Despre educația din România: https://uiorean.com/posts/2012-08-08-despre-educatia-din-romania/ - Vor romanii sa lucreze in strainatate?: https://uiorean.com/posts/2010-04-03-vor-romanii-sa-lucreze-in-strainatate/ - Popular Mechanix, 1922: https://uiorean.com/posts/2009-09-27-popular-mechanix-1922/ - ADAC is hiring Passive Network Specialist: https://uiorean.com/posts/2008-12-30-adac-is-hiring-passive-network-specialist/ - ADAC is hiring Senior Network Architect: https://uiorean.com/posts/2008-12-30-adac-is-hiring-senior-network-architect/ - Hello, World: https://uiorean.com/posts/hello-world/ - Ideas: https://uiorean.com/ideas/ - Projects: https://uiorean.com/projects/ - CREC (2003): https://uiorean.com/projects/crec-2003/ - SpamTUNNEL (2003): https://uiorean.com/projects/spamtunnel-2003/ - The x86 Assembler guide (2000-2001): https://uiorean.com/projects/x86-assembler-guide-2000-2001/ - Springfree trampoline S113: https://uiorean.com/projects/springfree-trampoline-s113/ - Opinions: https://uiorean.com/opinions/ - In the media: https://uiorean.com/media/ - About: https://uiorean.com/about/ - Diploma Thesis 2006: https://uiorean.com/about/diploma-thesis-2006/ - Contact: https://uiorean.com/about/contact/ - For Investors (why I don't answer): https://uiorean.com/about/for-investors/ Around 2000 I got familiar enough with x86 assembly language to write a tutorial about it. It ran as a monthly series in an online newsletter under the title "Assembler by example" (in Romanian, "Assambler prin exemple"), from September 2000 through March 2001. It proved more popular than I expected, mostly because the later installments took apart the inner workings of a real DOS virus. The whole series targeted 16-bit DOS on the x86, starting from the crudest tool available (`debug`) and working up to TASM, with every example built as a tiny `.com` program. Below is the full course, reproduced as it was originally published in Romanian. The separate source listings for the example programs have been lost to time, so where an installment linked out to one I have just noted that. The eight monthly installments: 1. [Assambler prin exemple, September 2000](#sep-2000): what assembly language is, and the first program, HelloWorld.com, typed in by hand at the `debug` prompt. 2. [Assambler prin exemple, October 2000](#oct-2000): that program explained line by line, the `mov` instruction, the register file, the segment:offset memory model, and the DOS `int 21h` services. 3. [Assembler by example III, November 2000](#nov-2000): moving to TASM, then a command-line XOR encryption tool that reads its password out of the Program Segment Prefix. 4. [Assembler by example IV, December 2000](#dec-2000): flags and conditional jumps, `PUSH`/`POP` and the stack, and the design of a self-decrypting COM program. 5. [Structura şi funcţionarea unui virus, January 2001](#ian-2001): the anatomy of a real (circa 1993) COM-infecting virus, the delta-offset trick, self-decryption, and dead code to fool heuristic scanners. 6. [Structura şi funcţionarea unui virus II, February 2001](#feb-2001): how the virus goes memory-resident, hooks `int 21h`, and infects COM files as they are executed. 7. [Fonturi în MSDOS, March 2001](#fonturi-2001): redefining character glyphs through `int 10h` to build a custom bitmap font, ending with a mouse-pointer glyph. 8. [Assembler By Example 8, March 2001](#pcx-2001): the finale, a 320x200 PCX image viewer that writes straight to video memory and sets the VGA palette by hand. ## Assambler prin exemple (septembrie 2000) {#sep-2000} Se spune ca ori ce programator 'adevarat' trebuie sa fi programat cel putin o data in asamblor. Pentru cine n-a facut-o, are acum ocazia sa afle cum se face. **Ce este Assambler (asamblor)?** Assamblerul este un Low Level Language, pentru a fi mai exacti, de nivelul cel mai de jos. Practic se da acces direct la resursele sistemului. In assambler nu se pot efectua decat operatii aritmetice simple (pentru care exista circuite electronice dedicate in procesor) citire si scriere pe porturi, accesarea directa a memoriei. A programa in assambler (fata de C de exemplu) este ca si cum ti-ai da toti angajatii din firma afara si te-ai apuca sa faci totul singur. Dezavantajele sunt multe, de exemplu trebuie sa-ti tii singur evienta adreselor, tipurilor de date si pointerilor. Codul este de obici absolut neportabil fiind foarte dependent de arhitectura interna a procesorului si a sistemului de operare (tot din acest motiv programarea in assambler nu se poate face numai cu 'biblia', cartea tehnica, la capatai). Avantajele sunt putine dar majore: codul generat este foarte mic si ruleaza rapid (cu exceptia cazului cand a fost prost gandit), stiti in ori ce moment ce se intampla!. Alt avantaj ar fi setul redus si clar de instructiuni, care face limbajul usor de invatat. Turbo Assambler, (TASM si probabil ca si MASM, creatia Microsoft, chiar daca n-am folosit-o niciodata, din motive religioase), care este un fel de compilator, rezolva si unele probleme legate de calcularea adreselor si generarea codului, facand programarea mai umana. Assamblerul se foloseste la crearea de programe mici unde viteza de executie este critica. Majoritatea virusilor sunt scrisi in assambler. **Primul Program** Acest prim program, HelloWorld.com, va fi scris cu ajutorul programului 'debug' care intra in componenta dosului in mod standard si se gaseste si in Windows (eu am W98SE si tot l-am gasit). In viitor vom folosi doar TASM, dar momentan, pentru simplitate (si pentru a lua cunostinta cu trivialitatea acestui mod de programare), folosim debug. La linia de comanda scrieti 'debug'. Va intampina un prompter prietenos: '-' (pentru help tastati '?' dar momentan e suficient sa transcrieti ce-i mai jos: ``` a ``` Programul va arata o adresa de genul XYZK:0100 si va invita sa tastati (cu enter dupa fiecare instructiune): ``` mov dx, 010c mov ah, 09 int 21 mov ax, 4c00 int 21 db 'Hello World!$' ``` Acum este momentul sa dati un enter fara nici o instructiune (linie goala). programul revine la prompterul initial. Tastati: ``` r CX ``` vi se raspunde, politicos 'CX 0000' si ':' tastati ``` 0019 ``` (acest numar nu corespunde in cazul in care ati decis sa folositi un mesaj mai lung... acest numar este numarul care corespunde linie-i goale pe care ati dat enter minus 100: XYZK:0119, atentie, totul este HEXA !!!) acum este momentul sa dati un nume programului dvs. si, ati ghicit, se face intr-un mod simplu si logic: ``` n HelloW.com ``` si acum comanda de scris pe HDD: ``` w ``` (vi se raspunde prompt: 'Writing 00119 bytes') iar acum sa iesim: ``` q ``` Buuuuun ! daca totul a mers bine, veti gasi in directorul curent un fisier Hellow.com. Acest fisier, daca este executat, va prezenta mesajul Hello World!. In caz ca n-ati pus semnul $ la sfarsitul mesajului, programul va scuipa pe ecran continutul memoriei, pana intalneste un simbol $. In numarul viitor urmeaza explicarea pas cu pas a programului! ## Assambler prin exemple (octombrie 2000) {#oct-2000} In numarul trecut am ramas la programul: ``` 0: mov dx, 010c 1: mov ah, 09 2: int 21 3: mov ax, 4c00 4: int 21 5: db 'Hello World!$' ``` Explicarea liniilor: **linia 0:** mov, mov vine de la move, a muta (instructiunile in assambler sunt de 2-4 litere) Instructiunea mov este de forma: ``` mov , ``` Efectul instructiunii mov este de a transfera valoarea desemnata de la . Instructiunea mov poate transfera valoarea dintr-un registru intr-altul, poate scrie valori intr-un registru (ca in cazul acesta) sau poate face treburi mai exotice, de genul: ``` mov ax, [bx] ``` pune in registrul ax valoarea aflata la adresa absoluta de memorie DS:BX Din explicatia precedenta probabil ca aveti 2 nelamuriri: - ce este un registru - si de ce o adresa este de genul DS:BX ... Incep cu adresa: Memoria calculatorului de arhitectura 80x86 este impartita in SEGMENTI de memorie de la 0000 la FFFF, fiecare SEGMENT fiind impartit in ADRESE RELATIVE de la 0000 la FFFF. Deci cand avem o adresa de genul 12AB:010C, prima parte (12AB) reprezinta segmentul de memorie, iar a doua (010C) adresa relativa la segment. (Sper ca na-ti chiulit in clasa a VII-a cand ati invatat ca cifrele in HEX, baza 16, sunt de la 0 la f). Treaba cu segmentul de memorie, e mult mai complicata decat pare la prima vedere (si se complica si mai tare in programarea pe 32 de biti) dar mai lamurim pe parcurs. **Si acum ce sunt REGISTRII ?!** Registrii sunt niste 'variabile' ale procesorului. Procesorul lucreaza rapid cu ele. Sunt primul lucru care o sa vi se para cu adevarat limitant la calculatorul dvs. pentru ca intotdeauna o sa va doriti sa mai aveti unul. In arhitectura 80x86, registri se clasifica in felul urmator: **Registrii de uz general: AX, BX, CX, DX** Acesti registrii sunt fiecare de cate 16 biti (respectiv fiecare poate contine un numar de forma 1FAB). Acesti registrii ii puteti umple cu ce doriti dvs. dar pentru unele instructiuni ei au semnificatii speciale. Fiecare dintre acesti registrii este impartit in doi registrii de 8 biti si se pot apela individual folosind denumirile AH, AL pentru AX; BH, BL pentru BX ... etc. AH reprezentand primii 8 biti (dintr-un numar de forma 1fab reprezinta 1f), H de la high si AL ultimi doi (deci AB din 1fab), l de la low...etc. Procesoarele de la 80386 in sus poseda niste registrii de 32 de biti notati cu EAX, EBX ... acestia nu-i puteti folosi decat intr-un mod special, numit mod protejat, iar momentan n-o sa va loviti de ei... **Registrii indicatori de adresa SP si BP** Registrii de 16 biti fiecare, indica de obicei adresa stivei SP:BP. Stiva este un fel de lada de gunoi a procesorului, unde acesta isi salveaza tot felul de date curente, gunoaie. Cand ne vom lovi de ea voi explica mai amanuntit acesti doi registrii si utilitatea stivei. **Registrii de index SI si DI** Acesti registrii, de 16 bit fiecare, se folosesc pentru a explica procesorului cum sa acceseze date din alti segmenti de memorie decat cel curent. Se folosesc rar la vedere, dar sunt vitali. Registrii de segment CS, DS, ES, SS Registrii de 16 biti fiecare - CS- contine adresa segmentului de memorie in care se afla codul (programul) - DS- adresa segmentului unde se afla datele folosite de program - ES- adresa unde se afla date auxiliare folosite de program - SS- adresa segmentului curent de stiva Mai exista un registru: IP (instruction pointer) care indica procesorului adresa relativa unde se afla urmatoarea instructiune care va fi executata. Cam acestia sunt registrii. Momentan trebuie sa tineti minte doar AX, BX, CX si DX. Pe parcurs ii vom folosi si pe ceilalti, dar acestia sunt cei mai utilizati. Buuun ! Deci e clar, In linia 0 incarcam valoare 010c in registrul dx... **linia 1:** In linia a doua facem cam acelasi lucru, respectiv incarcam valoarea 09 in ah. Dece imi place mie sa incarc valori aiurea in registrii, ramane de vazut mai tarziu. **linia 2:** Aici apare o instructiune noua: int 21. Aceasta instructiune executa o intrerupere de nivel 21. **Dar ce este o intrerupere ?!** O intrerupere este un semnal care este declansat de un eveniment intern sau extern (hard sau soft). Trebuie sa priviti intreruperile ca niste functii. Aceste functii sunt apelate la diferite evenimente, de exemplu la apasarea unei taste (eveniment hard) este executata o intrerupere de nivel 9, care va lua din bufferul unde este stocat, codul tastei apasate si va actiona in consecinta. In cazul curent declansam un eveniment soft, apelant intreruperea 21. (in episodul in care voi descrie programele care raman rezidente in memorie, TSR, voi prezenta cum functioneaza sistemul de intreruperi si ce treburi dragute se pot face cu el)... **Acum, de ce apelez int 21 ?!** Intreruperea 21 (numita si DOS services) este caracteristica sistemului de operare DOS si derivatilor acestuia, recursiv compatibili. Este o "multiplex interrupt", asta insemnand ca este o functie cu mai multe subfunctii independente, apelabile fiecare individual. In int21, sistemul DOS ne pune la dispozitie o colectie de functii care executa cele mai uzuale functii si faciliteaza interactiunea programului cu mediul exterior si cu sistemul de operare. Ori ce actiune ce se poate executa cu int 21 (ca de exemplu afisarea unui text), poate fi executata si fara int 21, apeland doar la intreruperi programate in hard (dar scrierea unui string ar fi mult mai complicata, hardul stiind sa scrie doar un caracter o data). **Structura de apelare a int 21** Pentru ca int 21 este o colectie de functii, undeva trebuie sa indicam subfunctia dorita. La apelarea int 21, intotdeauna registrul ah contine numarul subfunctiei dorite. In ceilalti registrii trebuie stocate diferite valori, in functie de subfunctia apelata. Subfunctiile lui int 21 sunt multe, deci nu aveti cum sa le invatati la toate modul de apelare. (Eu le stiu doar pe cele mai uzuale) In mod sigur aveti nevoie de un manual unde sa le aveti descrise. Eu am unul electronic, cine si-l doreste, i-l pun la dispozitie cu cea mai mare placere, via email. In cazul nostru dorim sa afisam un text pe ecran. In acest scop folosim int 21, subfunctia 09. Aceasta valoare (09) o incarcam in AH. Manualul ne spune ca aceasta subfunctie se asteapta sa gaseasca in DS:DX pointer la stringul care dorim sa-l afisam. Asta inseamna ca in DS:DX trebuie pusa adresa de memorie unde incepe textul. La intrarea intr-un program de tip COM, registrul DS este setat de sistem la valoare segmentului in care se afla programul. Avand in vedere ca si textul se afla in acelasi segment, nu alteram acest registru. Ramane doar DX. In acesta am decis sa pun valoarea 010C. Aceasta este adresa la care incepe textul. Cum am calculat-o ? Teoretic trebue sa calculez lungimea codului si sa adaug 100h. Nu are rost sa explic cum se face acest lucru. In numarul urmator transcriu acest cod in TASM, care ne scapa de pacostea calcularii adreselor. (Cine e totusi curios cum se face, poate sa-mi dea un email). Ni se mai spune in documentatie ce textul afisat trebuie sa se termine in simbolul '$' (care nu este afisat). Daca omiteti acest semn, va fi afisat continutul memoriei, pina cand se intalneste primul '$'. Dupa toate pregatirile apelam int 21, care isi face treaba constiincios. Nu putem verifica in nici un fel ca totul a mers bine, pentru ca functia nu returneaza nici o valoare, dar e bine de stiut ca sunt si functii care returneaza coduride eroare. Acum ne-am facut treaba si trebuie sa iesim cumva din program. Nu este indeajuns sa terminam codul. Cineva trebuie sa faca curat dupa noi in memorie si sa retransmita controlul sistemului de operare (plus sa inchida fisierele si sa faca multe altele). Treaba aceasta se poate face teoretic si manual dar ar lua multe pagini de cod degeaba. Mult mai simpla si mai facila este folosirea subfunctiei 4c din int 21. Deci, in linia 3 punem in ah valoarea 4c si in al 00. (mov ax, 4c00 este echivalent cu mov ah, 4c mov al, 00). Valoarea din al reprezinta valoarea pe care o returneaza programul sistemului de operare (in DOS teoretic ori ce program returneaza o valoare, aceasta valoare este utila in cazul scripturilor bat, cand dorim sa aflam daca un program a fost executat cu succes). In cazul nostru returnam valoarea 0 care in general inseamna OK. Apoi apelam int 21 pentru a pune capat executiei. In caz ca n-am fi executat aceasta secventa, procesorul ar fi interpretat toate datele din memorie ca si cod si probabil ca s-ar fi blocat (sau poate cine stie ?! ati fi gasit in mod miraculos a patra dimensiune). In linia 5 noi nu mai avem instructiuni ci avem textul de afisat. Procesorul ar interpreta si acest text ca si cod, dar nu ajunge niciodata la el, pentru ca exitul are loc in linia 4. Cam asta a fost cu 'Hello World !' Pentru nelamuriri, lucruri care nu le-am explicat indeajuns, sau sugestii, astept mailuri. In numarul viitor transcriem acest program in TASM (pentru a ne familiariza cu acest mediu de programare) + un program nou, mai complex si mai util. ## Assembler by example III (noiembrie 2000) {#nov-2000} **Motto:** *'Assembly is the language that before you can shoot yourself in the foot you have to invent the gun, hand, leg, and foot.'* Daca va mai amintiti, in numarul trecut, terminasem descrierea la Hello World! Acum vom transcrie programul in sursa pentru TASM. TASM vine de la TURBO assembler si este un compilator de assembler care ne ofera diferite facilitati, de la evidenta adreselor, pana la optimizarea codului (?!). Principalele avantaje sunt posibilitatea scrierii codului intr-un editor civilizat (nu ca la arhaicul debug) si calculare automata a adreselor de memorie. Momentan vom transcrie programul si vom da o explicatie scurta la fiecare linie. TASM este mult mai complex decat il voi prezenta aici, dar il voi prezenta mai pe larg pe parcurs. Iata codul: ``` .model tiny .code org 100h start: mov dx, offset text mov ah, 09h int 21h mov ax, 4c00h int 21h text db 'Hello World!$' end start ``` Parca nu exista modificari majore, nu ? Totusi iata ce a aparut: ``` .model tiny ``` Linia aceasta se pune la inceputul codului si explica compilatorului ca programul care intentionam noi sa-l facem este un program care isi pastreaza toate datele (codul, stack, buffer, date suplimentare) intr-un singur segment de memorie. Toate programele com sunt model tiny (mai exista modelele small, medium, large, huge, dar acestea sunt pentru fisiere exe). Eu personal sunt de parere ca ceea ce nu incape intr-un tiny n-ar trebui programat in assembler, deci toate programele care le vom folosi ca exemple vor fi model tiny. ``` .code ``` Aceasta linie explica compilatorului ca ceea ce va gasi el mai jos este codul programului si va trebui sa-l trateze ca atare. ``` org 100h ``` Aceasta linie explica compilatorului ca noi vom intentiona sa compilam respectivul program ca un fisier com. Fisierele com sunt incarcate de sistemul de operare direct in memorie (asta inseamna ca un fisier com contine exact imaginea programului din memorie in momentul executarii acestuia) intr-un segment liber de memorie, incepand cu adresa 0100h. Deci noi va trebui sa spunem compilatorului ca prima instructiune are adresa 0100h (si nu 0). Compilatorul necesita aceasta informatie pentru a calcula adresele la care se afla datele si adresele de salt absolut. ``` start... end start ``` Indica inceputul si sfarsitul programului. Intre start si end start (sau ori ce alt label) trebuie sa se afle toate functiile, subfunctiile, codul, date...etc a programului. Apoi urmeaza codul. In cod, sigurul lucru ciudat exte acel mov dx, offset text. Daca ne uitam mai jos, vedem ca textul nostru a primit un label (text). Deci practic ceea ce am zis noi se traduce in: pune in DX adresa (offset se traduce mai degraba ca 'la ce distanta de mine') textului text. Deci, in loc sa calculam noi unde se afla respectivul text (cum am facut pana acum) compilatorul face asta pentru noi. Acum cred ca am sa abandonez Hello World, pentru ca deja am invatat destule pe spinarea lui. Urmatorul program care il propun va face urmatoarele: va primi in linia de comanda 1 argument (o parola). Apoi va citi datele de la tastatura (fisier) si le va encripta folosind parola si va scrie pe ecran (fisier) rezultatul (vom privi tastatura ca un fisier si ecranul tot ca un fisier pentru ca intrarea si iesirea pot fi redirectionate). La acest program apar mai multe probleme. De exemplu, cum aflam ce a primit programul in linia de comanda: Poate va ganditi ca exista o functie speciala pentruasa cea... s-ar putea, dar eu nu o cunosc. Dar ceea ce cunosc este ca sistemul de operare creaza inainte sa execute un program un Program Segment Prefix lung de 100h bytes (h de la HEXA). N-am sa va spun ce contine acest PSP pentru ca gasesti aceste lucruri in carti de scoala. Ce am sa va spun este ca in byteul 80h se afla lungimea argumentului primit de program (normal, in hexa) si incepand cu byteul 81h (pana la 100h) se afla chiar argumentul. Deci ceea ce trebuie sa faca programul nostru pentru a afla argumentul cu care a fost lansat, este sa citeasca byteul 80h si sa citeasca atatea caractere din memorie, incepand cu 81h. O alta problema ar fi, cum se citesc fisierele (tastatura). *(codul acestui exemplu s-a pierdut in timp)* Ultima problema ar fi metoda de encryptare a fisierului. Sa nu va imaginat ca acum o sa aflati algoritmul blowfish sau ecryptarea PGP... Am decis sa folosesc o metoda 'didactica', care are si avantajul ca este reversibila folosind acelasi program (respecitv mai rulati programul o data pe fisierul criptat, cu aceeasi cheie si obtineti fisierul original). Aceasta metoda minune este metoda xor ('SAU EXCLUSIV') si se invata in clasa a 9-a (?!) capitolul logica matematica. Voi indica un tabel cu actiunea comenzii xor. (De mentionat ca xor acctioneaza la nivel de bit, deci tabelul se refera la biti): ``` sursa1 | 1 | 1 | 0 | 0 | sursa2 | 0 | 1 | 0 | 1 | ------------------------ rezulta| 1 | 0 | 0 | 1 | ``` Instructiunea XOR este definita asa: ``` XOR dest,src exclusive OR (toggle dest bits which are 1s in src) dest<-(dest ^ src) ``` Cam asta ar fi totul. Acum codul sursa (pentru cei care chiar vor sa invete, sa incerce prima data sa faca o schema logica a programului si sa incerce sa o transcrie in assembler si unde nu stiu sa se uite la programul meu): **Mentiune speciala:** Am un stil destul de dezordonat de programare si acest program nu ar trebui considerat etalon de nici un fel. *(codul sursa al programului s-a pierdut in timp)* Cam asta ar fi un cod functional. Codul se compileaza (asambleaza) cu comanda 'tasm cod.asm' care va genera un fisier obj iar apoi acest fisier se transforma in program com prin comanda 'tlink cod.obj /t'. Pentru a folosi programul pe fisiere, il vom apela asa: ``` program.com parola outfile ``` Linia outfile redirectioneaza intrarea de la fisierul infile iar iesirea pe fisierul outfile. Asfel vom obtine un fisier numit outfile, criptat cu 'parola'. Pentru a decripta fisierul rulam incodata criptarea cu aceeasi parola, dar inlocuind infile cu numele fisierului criptat. Momentan programul este functional, dar nu icercati sa criptati cu el documente ultrasecrete pentru ca poate fi spart in 30 de minute. Oricum, e bun de ascuns pozele alea de ochii parintilor :) Chiar daca majoritatea codului a fost explicata deja, apar unele elemente noi. Acestea vor fi dezbatute in numarul viitor, unde vom si extinde aria de functionalitate a programului. *In memoria celui care a fost Ioan Uiorean, bunicul meu.* ## Assembler by example IV (decembrie 2000) {#dec-2000} În numărul trecut prezentasem acel program de encryptare/decryptare. Dacă aţi înţeles cum funcţionează, totul este ok. Oricum, eu ţin neapărat să prezint elementele noi care apar în program. S-o luăm cu începutul... \*\*\* In lina 20 apare instrucţiunea JLE (Jump if less or equal). Procesoarele x86 au 8 biţi în memorie (un caracter) care sunt folosiţi ca flag-uri. Respectiv, în momentul executării unei comparaţii (şi alte instrucţiuni), aceşti biţi sunt setaţi sau nu (TRUE sau FALSE) in funcţie de rezultatul comparaţiei. Apoi, dacă executăm o instrucţiune ca cea de mai sus (JLE), procesorul analizează biţii de flag-uri şi acţionează în consecinţă. O instrucţiune gen JLE nu trebuie să succeadă imediat o instrucţiune CMP. Între ele pot fi oricâte instrucţiuni, cu condiţia să nu afecteze starea flag-urilor. Instrucţiunile de genul JC (Jump if Clear) pe care le întâlniţi după apelarea int 21h, verifică dacă a fost setat flag-ul de eroare. Ele au funcţia de a intercepta eventual erori în procesul de execuţie (un fel de trow/catch la C). \*\*\* În linia 43 apare instrucţiunea PUSH. Această instrucţiune salvează în stiva (despre care v-am vorbit in nr.2) conţinutul registrului care-l primeşte ca argument. Acesta instrucţiune se foloseşte împreună cu instrucţiunea POP care aduce din memorie \*\* ultima valoare salvata \*\* Deci instrucţiunile de genul: push CX pop AX au aceeaşi valoare ca si mov AX, CX. Stiva este un lucru foarte folositor dar se poate si umple. În general e de 255 de caractere dar depinde de sistem. Oricum, a umple stiva (sau a da pop când nu e nimic salvat în ea) e o metodă sigură de a bloca programul. În numărul acesta voi face o excepţie şi nu voi prezenta un program complet (printre altele şi pentru a va stimula să vă puneţi mintea la contribuţie pentru a va da seama dacă aveţi undeva neclarităţi). Oricum voi prezenta problemele principale legate de acest program. Iată la ce program m-am gândit: poate aţi observat ca în primul program (HelloWorld), mesajul era vizibil oricărui utilizator care s-ar uita la conţinutul fişierului binar. Ce facem dacă vrem sa creăm un program care să prezinte un mesaj care nu este vizibil la vizualizarea codului ? Sau mai bine, avem deja un program, care dorim să-l encryptam şi se va autodecrypta în momentul execuţiei ? În acest mod am şi proteja programul la eventuale încercări de dezasamblare (hackuire/spargere)...(nota: metoda prezentata aici este doar un exemplu...pentru o protecţie reala, ar trebui îmbunătăţit algoritmul de encryptare. Oricum, e mai bun decât nimic). Deci, programul se va manifesta cam aşa: Va primi la intrare un fişier COM. Îl va encrypta, şi ii va adăuga un cod de decryptare. Ceea ce obţinem este un program COM care va porni ceva mai greu dar va fi encryptat. Cum facem ca acest program să se autodecrypteze, cum adăugăm cod ? Codul de decryptare îl adăugăm pur şi simplu la sfârşitul programului encryptat. Pentru ca acest cod să fie executat înaintea oricărui altuia, trebuie să plasăm o instrucţiune jmp chiar la începutul codului, care va indica spre codul de decodare. ştiind că o instrucţiune jmp (jmp la adresa relativă şi nu absolută) ocupa trei bytes (e problema de experienţă), vom copia primi trei bytes originali ai programului la sfârşit şi îi vom înlocui cu jmp-ul de care avem nevoie. Treaba de a muta iarăşi bytesii originali la locul lor, revine codului de decodare. După ce acest lucru a fost făcut şi programul a fost decodat, nu trebuie decât sa executam un jmp la 100h (respectiv, unde începe programul com). Structura programului este simplă şi foloseşte elemente deja cunoscute. Funcţiile speciale de care aveţi nevoie sunt cele deja descrise. *(codul sursă al acestui exemplu s-a pierdut în timp)* Nu voi prezenta codul în numărul acesta, în schimb, în numărul viitor va apărea acest cod, dar extins. Anume: voi prezenta un virus. Singurul lucru care îl face virusul în plus fata de programul prezentat aici este faptul ca se propaga singur, fără ajutorul omului. Mai exact, îşi găseşte singur fişierele la care sa se ataşeze, fără să trebuiască să-i fie furnizate în linia de comandă. ## Structura şi funcţionarea unui virus (ianuarie 2001) {#ian-2001} În acest număr voi prezenta structura şi funcţionarea unui virus (in acest număr şi in numărul viitor acesta şi următorul). În primul rând voi prezenta codul virusului (asm). Aici am o mare dorinţă către voi: nu vă apucaţi să compilaţi virusul, doar ca să-i arătaţi vecinului de sus că sunteţi mai deştept ca el. Oricum virusul datează de prin 1993 şi sper că este detectat de toţi antiviruşii posibili. Deci, codul, ca să avem despre ce vorbi! *(codul complet al virusului s-a pierdut în timp)* Codul este in totalitate comentat, deci n-ar trebui să fie o problemă să descifraţi (cu biblia aproape) ceea ce se întâmplă. oricum, iată câteva explicaţii: Dacă ne uităm la începutul codului, vom observa că programul îşi face o intrare destul de ciudată, cu un CALL (apel la subrutină) la linia următoare. Acest lucru este necesar din următorul motiv: mare problemă a viruşilor, este faptul că infectează fişiere de mărime variabilă. Din acest motiv, nu ştim niciodată o instrucţiune sau un buffer la ce adresă se află. Fiindcă avem nevoie de adresa la care începe virusul, executăm acest call. Apoi, trebuie să ştim că instrucţiunea call salvează în stack, adresa de la care sa executat call-ul. Următoarele instrucţiuni au unicul scop de a pune valoarea adresei in bp. Mai departe acest bp va fi folosit ca "delta" în ori ce apel la adresă absolută, respectiv orice adresă va fi indexată cu valoarea lui bp, practic lungimea programului infectat. În acest sens nu vom mai folosi instrucţiunea mov pentru a pune adresa absolută într-un registru şi apoi să-i adăugăm bp, ci vom folosi instrucţiunea LEA, care face cam acelaşi lucru. Apoi urmează o serie de instrucţiuni care vor decripta programul. Virusul se ataşează la fişier în formă ecryptată, dar pentru a fi executat, trebuie întâi decryptat. Problema care se pune aici, este că la prima rulare (în momentul când virusul este executat prima dată, fără să fie ataşat la un program) el se află în stare necryptată. De aceea el îşi compara primul byte al programului cu ceea ce ar trebui să fie în stare necryptată. În caz că află că este necryptat, sare peste procedura de decryptare. Procedura de cryptare este simplă, prin negarea (înlocuieşte 1 cu 0 şi invers) biţilor. Apoi urmează câteva secvenţe de cod care nu sunt executate niciodată (sau n-au nici un efect), unicul lor scop fiind de a induce în eroare antiviruşii care folosesc metoda heuristică de căutare a viruşilor. Următorul pas este să se verifice dacă virusul este activ în memorie. În acest scop, virusul apelează o subfuncţie a int 21, inexistentă în mod normal, dar care virusul si-o creează în momentul în care se încarcă în memorie (vom vedea mai jos). În caz că primeşte răspunsul aşteptat, decide că este deja activ, şi nu se mai încarcă o dată în memorie. Apoi el restaurează primii 3 bytes ai programului infectat şi îi transferă acestuia controlul. În caz că acesta constată că nu este deja activ în memorie, începe procesul lung şi complicat al transferului în memorie. O dată activ în memorie, virusul va infecta ori ce program rulat, care nu a fost infectat deja. Despre acest aspect vom discuta în numărul viitor. În acest director voi pune şi altele, când va fi nevoie. ## Structura şi funcţionarea unui virus II (februarie 2001) {#feb-2001} A rămas în numărul trecut la problema încărcării virusului în memorie. Folosind subfuncţia 35h a int21h, virusul află vectorul întreruperii 21h. *(codul acestui pas s-a pierdut în timp)* Trebuie să ştiţi că memoria unui PC începe cu o zonă numită tabelă de întreruperi, practic o zonă în care există o listă de adrese. Aceste adrese reprezintă adresa codului unde este tratată acea întrerupere. Asta înseamnă că, în momentul când sistemul primeşte o întrerupere de nivel 0 (sau 1, 2, etc) acesta execută practic un jump la prima (sau a doua, etc.) adresa din tabela de întreruperi şi de acolo execută un jump la adresa indicată, numită vector de întrerupere. Deci programul nostru doreşte să afle unde se află codul care tratează întreruperea 21h. După ce află, salvează această adresă într-o zonă special rezervată la sfârşitul codului. Codul care urmează este greu de explicat şi oricum ar fi fără sens să explic cum face. Ceea ce face este să afle dimensiunile programului folosind MCB, un prefix al programului, creat de sistemul de operare, în momentul lansării acestuia în execuţie. Apoi, folosind subfuncţia 48h a int 21h, virusul îşi alocă memoria necesară pentru a rămâne rezident. *(codul acestui pas s-a pierdut în timp)* După ce a primit spaţiu în memorie, virusul se copiază în acel spaţiu, folosind instrucţiunile REP şi MOVSB. Cele două instrucţiuni fac parte din categoria String Operation Instructions şi au următoarele definiţii. *(definiţiile şi codul s-au pierdut în timp)* Acum, nu avem decât să modificăm tabela de întreruperi, astfel încât vectorul de la int21h să indice către codul nostru. În acest scop folosim subf 25h a int 21h. *(codul acestui pas s-a pierdut în timp)* Din acest moment, ori ce int21h care este executată pe sistem, va trece prima dată prin codul virusului nostru (nu tot codul ci doar secţiunea care este în memorie, şi anume de la "Handler...", pentru că aşa am setat vectorul). Acum virusul restaurează primii 3 bytes ai programului original, şi îi transferă acestuia controlul. Secţiunea de cod care urmează acum ar putea fi considerată un alt program. Acesta este codul care rămâne rezident în memorie şi care se ocupă de infectare şi altele. Nu trebuie să scăpăm din vedere faptul că acest cod este executat de fiecare dată când un program apelează int21h. Deci să începem. În momentul în care este executat in21h, pe noi (virusul) ne interesează ce subfuncţie este apelată. În acest scop executăm o serie de comparaţii. Subfuncţiile care ne interesează sunt: ``` 4bh - execută program CAh - resident check ``` Celelalte două subfuncţii se referă la schimbarea directoarelor şi discurilor. Codul nu face nimic în momentul în care le întâlneşte, ele există doar pentru un upgrade viitor al virusului. Subf. CAh: Dacă este apelată aceasta subfuncţie, virusul ştie că o altă copie a sa de pe sistem, încearcă tocmai să afle dacă virusul este rezident sau nu. De aceea, virusul rezident răspunde punând în bh, Ca. Apoi este executat mai departe vechiul cod al int21 (ca şi în cazul în care nici una dintre subfuncţii nu este interceptată). *(codul pentru subf. 4bh s-a pierdut în timp)* Dacă se apelează această funcţie, înseamnă că sistemul de operare sau un alt program, doreşte să execute un program. Noi dorim să interceptăm acest program şi să-l infectăm. În primul rând salvăm toţi regiştrii cu care a fost apelată int21h, ca să-i putem restaura în momentul execuţiei vechiului int21h. În acest moment avem la adresa DS:DX un string care indică un program care trebuie să fie executat. Noi vom încerca să infectăm acest program înainte să fie executat. Întâi, cu subf 43h, citim atributele fişierului (readonly, etc) şi le modificăm pentru a putea accesa normal fişierul. Vechile atribute sunt salvate pentru a fi restaurate după infectare. Dar prima dată trebuie să aflăm dacă fişierul nu a fost infectat deja. Virusul foloseşte o metodă empirică: Află atributele fişierului (time-dat) cu subf. 57h. Dacă secundele de la atributele fişierului (respectiv data şi ora la care a fost modificat) sunt egale cu 58, atunci virusul trage concluzia ca fişierul este deja infectat şi îl lasă în pace. Dacă nu, urmează procesul de infectare. Fişierul este deschis cu subfn 3dh, pentru citire-scriere. Acum începe infectarea. Mutăm pointerul de citire la sfârşit, folosind 42h. Astfel aflăm dimensiunile programului de infectat. Această dimensiune ne este necesară pentru a calcula jmp-ul care trebuie scris la începutul fişierului. Apoi mutăm pointerul înapoi la început şi citim primii 3 bytes, cei care trebuie înlocuiţi cu jmp-ul. Un lucru am uitat să facem: nu ştim dacă fişierul pe care lucrăm e com sau exe... Pentru că noi suntem un virus care infectează doar com-uri. În acest scop, comparăm octeţii citiţi cu MZ. Dacă găsim MZ, atunci fişierul este un exe, nu avem ce-i face, restaurăm atributele şi ieşim. (Notă istorică: toate fişierele EXE încep cu MZ. MZ vine de la Mark Zbigovski, unul dintre designerii DOS). Dacă totuşi fişierul nostru este un com, calculăm distanţa la care trebuie făcut jmp-ul şi îl scriem la începutul fişierului. Apoi luăm codul virusului, aflat în memorie, şi jonglând cu el, îl copiem într-un alt spaţiu şi îl encryptăm, tot în afară de primii bytes de decryptare. Observăm că procedura de encyptare este complementară cu cea de decryptare de la începutul virusului. Acum avem de două ori virusul în memorie: o copie care rulează şi o copie care este ecryptată. Nu ne mai rămâne decât să ataşăm această a doua copie la programul original. Acum fişierul este infectat cu succes. Nu ne mai rămâne decât să restaurăm atributele originale ale fişierului, regiştrii cu care a fost apelată int21h şi să transferăm controlul procedurii vechi de tratare a întreruperii. Cam acesta este un virus. După cum vedeţi, este un program complex, care cere o cunoaştere detaliată a sistemului de operare şi a assembler-ului. Majoritatea viruşilor sunt exemple de programare. În numărul viitor părăsim tărâmul codului ascuns şi ne vom ocupa un pic de grafica în Assembler. ## Fonturi în MSDOS (martie 2001) {#fonturi-2001} Multa vreme am crezut ca fonturile (si toate necazurile care deriva din ele) ar fi apanajul sistemelor grafice. Dar, surpriza, si in DOS se pot schimba fonturile. Mai jos voi prezenta metoda: Folosind întreruperea 10h (video services) putem face multe efecte speciale. Una dintre subfunctiile acestei întreruperi este 1110H (=AX). Iata o explicatie mai amanuntita a metodei de apelare: ``` BH înaltimea fiecarui caracter (biti/ caracter ddefinit) BL Blocul de fonturi care trebuie incarcat (EGA: 0-3; VGA: 0-7) CX numarul de caractere care vor fi redefinite DX Codul ASCII al primului caracter redefinit în tabelul de la ES:BP ES:BP adresa definitiei fonturilor ``` Explicatii suplimentare: BH înaltimea caracterului. Latimea caracterului este întotdeauna de 8 biti. BL pot fi definite pâna la 8 seturi de caractere. Având în vedere ca dorim sa modificam fontul activ, BL va fi 0. La adresa ES:BP vom pune un tabel cu descrierea fonturilor. Tabelul ar trebui sa aiba lungimea de BH*CX baiti. Definirea fonturilor se face in felul urmator: ``` =00000000=00 =00000000=00 ___ =00111000=38 __ __ =01101100=6C __ __ =11000110=C6 __ __ =11000110=C6 __ __ =11000110=C6 _______ =11111110=FE __ __ =11000110=C6 __ __ =11000110=C6 __ __ =11000110=C6 __ __ =11000110=C6 =00000000=00 =00000000=00 =00000000=00 =00000000=00 ``` (caracterul A) devine urmatorul sir de baiti: 00,00,38,6C,C6,C6,C6,FE,C6,C6,C6,C6,00,00,00,00 Ideea în spatele acestei prezentari ar putea parea stupida. Dar are si unele utilitati: de exemplu Norton Utilities (4 DOS) foloseste cu succes o metoda de afisare semi grafica, si anume, redefinind unele caractere speciale creaza itemuri ca checkboxuri, dropdownlist etc. În numarul de astazi intentionez sa prezint demonstrativ un program care sa modifice fontul unui caracter cu un font care sa reprezinte o sageata de mouse. Astfel, când este initializat mouseul cu acel caracter, veti avea un pointer adevarat... Iata cam cum va arata pointerul nostru: ``` 00000000 == 00 00000000 == 00 01000000 == 40 01100000 == 60 01110000 == 70 01111000 == 78 01111100 == 7C 01111110 == 7E 00011100 == 1C 00011100 == 1C 00001110 == 0E 00001110 == 0E 00000000 == 00 00000000 == 00 00000000 == 00 00000000 == 00 ``` Deci: 00, 00, 40, 60, 70, 78, 7C, 7E, 1C, 1C, 0E, 0E, 00, 00, 00, 00 Acum nu mai trebuie decât sa stim codul ASCII al caracterului care dorim sa-l modificam, care este 21 (!), si ne putem apuca de program. Programul este extrem de simplu, dar pentru a modifica întreg seul de caractere, trebuie depusa un pic de munca. Ca demonstratie exista un program care face asta. *(codul acestui program s-a pierdut in timp)* ## Assembler By Example 8 (martie 2001) {#pcx-2001} Acesta fiind ultimul număr din Assembler by Example, m-am gândit să public ceva special. Astfel, fiind la capitolul grafică, am făcut un program care afisează un fisier PCX pe ecran (în DOS mode). Programul este oarecum limitat, fiind capabil să afiseze numai fisiere de 320x200 pixeli. Codul este în totalitate comentat, deci ar trebui să îl întelegeti fără alte explicatii. *(imaginea de exemplu, descrierea formatului PCX si codul sursă al programului s-au pierdut în timp)* In primul rând verificam dacă fisierul PCX există. Apoi îl deschidem. Presupunând că totul a decurs normal, procedăm la decodarea lui. Pentru a intelege procesul de decodare al fisierului, trebuie să studiati cu atentie descrierea formatului PCX. Este mult mai simplu decât vă imaginati si este un exercitiu bun de programare (desi formatul este cam "nefericit"). Pentru a comunica cu dispozitivul de afisare folosim doua metode: copiem biti in memoria video (bit blitting, o metoda asa de veche incât la HC nu se mai folosea, fiind considerată lentă si învechită, dar s-a revenit la ea, e metoda preferată la animatie 3d) si a doua metodă este de a face out pe portul vga (3c8h) pentru a seta paleta de culori. (In rutina de setare a paletei de culori, putem introduce tot felul de functii de modificare a bitiilor, astfel vom obtine efecte ciudate, unele interesante. Dacă facem aceste transformări dinamic, putem obtine o imagine cu culori schimbătoare...) Apoi schimbăm din nou modul video in text 80x25 (standardul dos) si iesim. Cam acesta este tot programul. Acest program demonstrează puterea assembler-ului si tot odată poate constitui baza pentru alte aplicatii grafice sub dos (?!). Eu personal m-am distrat copios scriindu-l si apoi modificându-l. Printre altele am reusit să fac un mic player video sub dos, folosind repetat rutina de afisare. Rutina este însă asa de rapidă (lucru bun!) încât a trebuit să introduc temporizări între cadre (pe un Celeron la 300). Cam atât a fost ce am avut eu să vă spun despre assembler (sub DOS). Nu este nici pe departe totul, n-am discutat programarea pe 32 de biti/sub windows. Personal cred că assemblerul n-ar trebui folosit la "programare" sub windows ci doar la debuging. Sper sa pot realiza si o descriere a programarii sub windows, dar asta cel mai devreme peste 4 luni, dupa bac... Assemblerul rămâne in continuare metoda preferată în caz că se cere executare rapidă si consum mic de resurse. Îmi cer scuze deca am lasat lucruri "in aer", mailu meu ramâne deschis pentru ori ce intrebare la care sper sa va pot raspunde...