Risc-v assembly language programming: unlock the power of the risc-v instruction set (maker innovati

Page 1


Set (Maker

Series) 1st Edition Smith

Visit to download the full and correct content document: https://textbookfull.com/product/risc-v-assembly-language-programming-unlock-the-p ower-of-the-risc-v-instruction-set-maker-innovations-series-1st-edition-smith/

More products digital (pdf, epub, mobi) instant download maybe you interests ...

RISC-V Assembly Language Programming: Unlock the Power of the RISC-V Instruction Set (Maker Innovations Series) 1st Edition Stephen Smith

https://textbookfull.com/product/risc-v-assembly-languageprogramming-unlock-the-power-of-the-risc-v-instruction-set-makerinnovations-series-1st-edition-stephen-smith/

The RISC V Instruction Set Manual Volume II Privileged Architecture Andrew Waterman

https://textbookfull.com/product/the-risc-v-instruction-setmanual-volume-ii-privileged-architecture-andrew-waterman/

Computer Organization and Design The Hardware Software Interface RISC V Edition David A. Patterson

https://textbookfull.com/product/computer-organization-anddesign-the-hardware-software-interface-risc-v-edition-david-apatterson/

Computer Organization and Design RISC V Edition The Hardware Software Interface David A. Patterson

https://textbookfull.com/product/computer-organization-anddesign-risc-v-edition-the-hardware-software-interface-david-apatterson/

Modern Computer Architecture and Organization Learn x86

ARM and RISC V architectures and the design of smartphones PCs and cloud servers 2nd Edition Ledin

https://textbookfull.com/product/modern-computer-architectureand-organization-learn-x86-arm-and-risc-v-architectures-and-thedesign-of-smartphones-pcs-and-cloud-servers-2nd-edition-ledin/

Sovereignty at the Paris Peace Conference of 1919

Leonard V. Smith

https://textbookfull.com/product/sovereignty-at-the-paris-peaceconference-of-1919-leonard-v-smith/

Power Electronics Devices and Circuits May 01 2011

Jagannathan V 2nd Edition Jagannathan V

https://textbookfull.com/product/power-electronics-devices-andcircuits-may-01-2011-jagannathan-v-2nd-edition-jagannathan-v/

Parallel Computers Architecture and Programming V. Rajaraman

https://textbookfull.com/product/parallel-computers-architectureand-programming-v-rajaraman/

Literacies and Language Education 3rd Edition Brian V.

Street

https://textbookfull.com/product/literacies-and-languageeducation-3rd-edition-brian-v-street/

Maker Innovations Series

Jumpstart your pathto discovery withthe Apress Maker Innovations series! Fromthe basics ofelectricity and components throughto the most advancedoptions in robotics andMachine Learning,you’llforge a pathto buildingingenious hardware andcontrollingit withcuttingedge software. Allwhile gainingnew skills andexperience withcommontoolsets youcantake to new projects or even into a whole new career.

The Apress Maker Innovations series offers projectsbasedlearning,while keepingtheory andbest processes front andcenter. So youget hands-onexperience while also learningthe terms ofthe trade andhow entrepreneurs, inventors,andengineers think throughcreatingand executinghardware projects. Youcanlearnto design circuits,programAI,create IoT systems for your home or evencity,andso muchmore!

Whether you’re a beginninghobbyist or a seasoned entrepreneur workingout ofyour basement or garage,you’ll scale upyour skillset to become a hardware designand engineeringpro. Andoftenusinglow-cost andopen-source software suchas the Raspberry Pi,Arduino,PIC microcontroller,andRobot OperatingSystem(ROS). Programmers andsoftware engineers have great opportunities to learn,too,as many projects andcontrol environments are basedinpopular languages andoperating systems,suchas PythonandLinux.

Ifyouwant to builda robot,set upa smart home,tackle assemblinga weather-ready meteorology system,or create a brand-new circuit usingbreadboards andcircuit design software,this series has allthat andmore! Writtenby

creative andseasonedMakers,every book inthe series tackles bothtestedandleading-edge approaches and technologies for bringingyour visions andprojects to life. More informationabout this series at https://link.springer.com/bookseries/17311.

StephenSmith

RISC-V Assembly Language

Programming

Unlock the Power of the RISC-V Instruction Set

ISSN 2948-2542

Maker Innovations Series

e-ISSN 2948-2550

ISBN 979-8-8688-0136-5 e-ISBN 979-8-8688-0137-2

https://doi.org/10.1007/979-8-8688-0137-2

© StephenSmith2024

This work is subject to copyright. Allrights are solely and exclusively licensedby the Publisher,whether the whole or part ofthe materialis concerned,specifically the rights of translation,reprinting,reuse ofillustrations,recitation, broadcasting,reproductiononmicrofilms or inany other physicalway,andtransmissionor informationstorage and retrieval,electronic adaptation,computer software,or by similar or dissimilar methodology now knownor hereafter developed.

The use ofgeneraldescriptive names,registerednames, trademarks,service marks,etc. inthis publicationdoes not imply,eveninthe absence ofa specific statement,that such names are exempt fromthe relevant protective laws and regulations andtherefore free for generaluse.

The publisher,the authors,andthe editors are safe to assume that the advice andinformationinthis book are believedto be true andaccurate at the date ofpublication. Neither the publisher nor the authors or the editors give a warranty,expressedor implied,withrespect to the material containedhereinor for any errors or omissions that may

have beenmade. The publisher remains neutralwithregard to jurisdictionalclaims inpublishedmaps andinstitutional affiliations.

This Apress imprint is publishedby the registeredcompany APress Media,LLC,part ofSpringer Nature. The registeredcompany address is: 1 New York Plaza,New York,NY 10004,U.S.A.

Thisbookisdedicatedtomybelovedwifeandeditor CathalynnLabonté-Smith.

Introduction

The heart ofevery computer andsmart device is a Central ProcessingUnit (CPU). Historically,eachCPU has been producedby a single company whichtightly controls the instructionset andinternalworkings ofthe CPU. RISC-V (pronouncedRisk Five) is a new approachbasedonopensource principles. Anyone canimplement a RISC-VCPU usinga standardizedinstructionset without requiringany speciallicensingor royalty payments. As a result,RISC-V CPUs canbe at a muchlower cost thanproprietary CPUs andhave explodedinthe low-cost microcontroller space. Now that more powerfulRISC-VCPUs are appearing, leadingto Single BoardComputers (SBCs) similar to the Raspberry Pi,alongwithinexpensive low-endlaptops and tablets,this book presents the inner workings oftypical RISC-VCPUs anddetails the open-source Assembly Language instructionset they allimplement.

Assembly Language is the native,lowest levelway to programa computer. Eachprocessingchiphas its own Assembly Language. This book teaches programmingRISC-V CPUs either running32- or 64-bits.

Learninghow a computer works,andmasteringAssembly Language,is anexcellent way to get into the nitty-gritty details. These low-cost microcontrollers andSBCs provide idealplatforms to learnadvancedconcepts incomputing.

Eventhoughallofthese devices are low-poweredand compact,they’re stillsophisticatedcomputers,many of whichare capable ofrunningthe fullLinux operatingsystem. Due to the RISC-Vinstructionset standard,learningto programonone RISC-Vprocessor is directly applicable to all RISC-Vprocessors.

Inthis book,we cover how to programRISC-Vprocessors at the lowest level,operatingas close to the hardware as possible. Readers willlearnthe following:

How to format instructions andcombine theminto programs,as wellas details ofthe operative binary data formats

How to programRISC-Vinstructionset extensions,suchas floating-point instructions

How to controlintegratedhardware devices by reading andwritingto the hardware controlregisters directly How to interact withthe Linux operatingsystemand microcontroller SDKs

The simplest way to learnthese tasks is witha RISC-V SBCsuchas the Starfive Visionfive 2. The book also details how to emulate the RISC-VCPU onanIntel/AMD computer usingthe QEMU emulator,as wellas how to programthe EspressifESP32-C3 microcontroller. Allthe tools neededto learnAssembly Language programmingare opensource and readily available.

This book contains many workingprograms to play with, use as a startingpoint,or study. The only way to learn programmingis by doingit,so do not be afraidto experiment,as it is the only way to learn.

EvenifAssembly Language programmingisn’t usedin your day-to-day life,knowinghow the processor works at the Assembly Language levelandknowingthe low-levelbinary data structures willmake youa better programmer inall other areas. Knowinghow the processor works willlet you write more efficient Ccode andcanevenhelpwithPython programming.

Enjoy this introductionto Assembly Language. Learningit for one processor family helps withlearningandusingany other processor architectures encounteredthroughout a programmer’s career.

Any source code or other supplementary materialreferenced by the author inthis book is available to readers onGitHub (https://github.com/Apress). For more detailedinformation, please visit https://www.apress.com/gp/services/sourcecode.

Acknowledgments

No book is ever writteninisolation. I want to especially thank my wife CathalynnLabonté-Smithfor her support, encouragement,andexpert editing.

I want to thank allthe goodfolks at Apress who made the whole process easy andenjoyable. Aspecialshout-out to NirmalSelvaraj,my productioneditor,who kept the whole project movingquickly andsmoothly. Thanks to Miriam Haidara,the acquisitions editor,for mobile techandmaker programs,who got the project started. Thanks to Stewart Watkiss,my technicalreviewer,who helpedmake this a far better book.

Table of Contents

Chapter 1: Getting Started

History and Evolution of the RISC-V CPU

What You Will Learn

Ten Reasons to Learn Assembly Language

Programming

Running Programs on RISC-V Systems

Coding a Simple “Hello World” Program

Hello World on the Starfive Visionfive 2

Programming Hello World in the QEMU Emulator

About Hello World on the ESP32-C3 Microcontroller

Summary

Exercises

Chapter 2: Loading and Adding

Computers and Numbers

Negative Numbers

About Two’s Complement

RISC-V Assembly Instructions

CPU Registers

RISC-V Instruction Format

About the GCC Assembler

Adding Registers

32-bits in a 64-bit World

Moving Registers

About Pseudoinstructions

About Immediate Values

Loading the Top

Shifting the Bits

Loading Larger Numbers into Registers

More Shift Instructions

About Subtraction

Summary

Exercises

Chapter 3: Tooling Up

GNU Make

Rebuild a Project

Rule for Building .S files

Define Variables

Build with CMake

Debugging with GDB

Preparation to Debug

Setup for Linux

Set Up gdb for the ESP32-C3

Debugging with GDB

Summary

Exercises

Chapter 4: Controlling Program Flow

Creating Unconditional Jumps

Understanding Conditional Branches

Using Branch Pseudoinstructions

Constructing Loops

Create FOR Loops

Code While Loops

Coding If/Then/Else

Manipulating Logical Operators

Using AND Using XOR

Using OR

Adopting Design Patterns

Converting Integers to ASCII

Using Expressions in Immediate Constants

Storing a Register to Memory

Why Not Print in Decimal?

Performance of Branch Instructions

Using Comparison Instructions

Summary

Exercises

Chapter 5: Thanks for the Memories

Defining Memory Contents

Aligning Data

About Program Sections

Big vs. Little Endian

Pros of Little Endian

About Memory Addresses

Loading a Register with an Address

PC Relative Addressing

Loading Data from Memory

Combining Loading Addresses and Memory

Storing a Register

Optimizing Through Relaxing

Converting to Uppercase

Summary

Exercises

Chapter 6: Functions and the Stack

About Stacks

Jump and Link

Nesting Function Calls

Function Parameters and Return Values

Managing the Registers

Summary of the Function Call Algorithm

Uppercase Revisited

Stack Frames

Stack Frame Example

Macros

Include Directive

Macro Definition

Labels

Why Macros?

Using Macros to Improve Code

Summary

Exercises

Chapter 7: Linux Operating System Services

So Many Services

Calling Convention

Finding Linux System Call Numbers

Return Codes

Structures

About Wrappers

Converting a File to Uppercase

Building .S Files

Opening a File

Error Checking

Looping

Summary

Exercises

Chapter 8: Programming GPIO Pins

GPIO Overview

In Linux, Everything is a File

Flashing LEDs

Moving Closer to the Metal

Virtual Memory

In Devices, Everything is Memory

Registers in Bits

GPIO Enable Registers

GPIO Output Set Registers

More Flashing LEDs

GPIOTurnOn in Detail

Root Access

Summary

Exercises

Chapter 9: Interacting with C and Python

Calling C Routines

Printing Debug Information

Register Masking Revisited

Calling Assembly Routines from C

Packaging the Code

Static Library

Shared Library

Embedding Assembly Language Code inside C Code

Calling Assembly from Python

Summary

Exercises

Chapter 10: Multiply and Divide

Multiplication

Examples

Division

Division by Zero and Overflow

Example

Example: Matrix Multiplication

Vectors and Matrices

Multiplying 3x3 Integer Matrices

Summary

Exercises

Chapter 11: Floating-Point Operations

About Floating Point Numbers

About Normalization and NaNs

Recognizing Rounding Errors

Defining Floating Point Numbers

About Floating Point Registers

The Status and Control Register

Defining the Function Call Protocol

Loading and Saving FPU Registers

Performing Basic Arithmetic

Calculating Distance Between Points

Performing Floating-Point Conversions

Floating-Point Sign Injection

Comparing Floating-Point Numbers

Example

Summary

Exercises

Chapter 12: Optimizing Code

Optimizing the Uppercase Routine

Simplifying the Range Comparison

Restricting the Problem Domain

Tips for Optimizing Code

Avoiding Branch Instructions

Moving Code Out of Loops

Avoiding Expensive Instructions

Use Macros

Loop Unrolling

Delay Preserving Registers in Functions

Keeping Data Small

Beware of Overheating

Summary

Exercises

Chapter 13: Reading and Understanding Code

Browsing Linux & GCC Code

Comparing Strings

Code Created by GCC

Reverse Engineering and Ghidra

Summary

Exercises

Chapter 14: Hacking Code

Buffer Overrun Hack

Causes of Buffer Overrun

Stealing Credit Card Numbers

Stepping Through the Stack

Mitigating Buffer Overrun Vulnerabilities

Do Not Use strcpy

PIE Is Good

Poor Stack Canaries Are the First to Go

Preventing Code Running on the Stack

Tradeoffs of Buffer Overflow Mitigation Techniques

Summary

Exercises

Appendix A: The RISC-V Instruction Set

Appendix B: Binary Formats

Appendix C: Assembler Directives

Appendix D: ASCII Character Set

Appendix E: Answers to Exercises

Index

About the Author

Stephen Smith is a software architect,locatedin Gibsons,BC,Canada. He’s been developingsoftware since high school,or way too many years to record. He is anexpert inArtificial Intelligence andAssembly Language programming,earned his AdvancedHAM Radio License, andenjoys mountainbiking,hiking, andnature photography. He volunteers for Sunshine Coast SearchandRescue. He is the author ofRaspberryPiAssembly LanguageProgramming:ARM ProcessorCoding,Programming with64-BitARMAssembly Language:SingleBoardComputerDevelopmentfor RaspberryPiandMobileDevices,andRP2040Assembly LanguageProgramming:ARMCortex-M0+onthe RaspberryPiPico,allpublishedby Apress. Also,he writes his popular technology blog,at smist08.wordpress.com.

About the Technical Reviewer

Stewart Watkiss is a keenmaker who has created numerous physicalcomputing projects usinga variety of computers andmicrocontrollers. He is author ofthe Apress titles LearnElectronicswithRaspberry PiandBeginningGame ProgrammingwithPygameZero. He studiedat the University of Hull,where he earneda master’s degree inelectronics engineering, andmore recently at Georgia Institute ofTechnology,where he earneda master’s degree incomputer science.

Stewart also volunteers as a STEM ambassador,helping teachprogrammingandphysicalcomputingto schoolchildren andat Raspberry Pievents. He has creatednumerous resources for those wantingto learnmore about electronics andcomputingwhichare available onhis website (www.penguintutor.com).

© TheAuthor(s),underexclusivelicensetoAPressMedia,LLC,partofSpringerNature2024 S Smith,RISC-VAssemblyLanguageProgramming,MakerInnovationsSeries https://doiorg/101007/979-8-8688-0137-2 1

1.GettingStarted

(1)

MostpeoplearefamiliarwithIntelorAMDmicroprocessorslyingattheheartoftheir desktop,laptop,orserver,and,similarly,mostcellphonesandtabletsuseARM microprocessors.RISC-Visthenewentrybuiltaroundopen-sourceconcepts.Before gettingintothedetailsofRISC-V,let’sfirstlookatthehistoryandevolutionofmodern microprocessors

HistoryandEvolutionoftheRISC-VCPU

Attheheartofeverycomputer,thereisatleastoneCentralProcessingUnit(CPU)that executestheprogramsthatyourun MostmoderncomputershaveseveralCPUs,themain onetoruntheoperatingsystemanduserprograms,thenseveralhelperCPUstooffload taskslikenetworkcommunications.Solid-statedrives(SSDs)andharddrives(HDDs)each containaCPUtoreadandstorethedata.Nearlyeveryhouseholdappliancefrom microwavestothermostatscontainsaCPUthatinterpretsbuttonpushesandperformsthe appliance’sfunction Amodernautomobiletypicallycontains1000to3000CPUchipsto controleverythingfromtheinfotainmentsystemtothepowersteeringtothebraking systems.CPUsrangeinpricefromafewcentstothousandsofdollars,andeachrunsits ownspecialmachinecodetoexecuteprograms.

EarlyCPUs,suchastheIBM360mainframe,werelarge,complicated,andcomprisedof thousandsofdiscretecomponents.In1971,InteldebutedtheIntel4004,asinglechip4-bit CPUthatallowedtheproliferationofhandheldcalculators ThisledtomoreadvancedCPUs suchastheMOSTechnology6502whichhadtherightcombinationofbeingbothaffordable yetpowerfulenoughtocreateboththepersonalcomputerandvideogameindustrieswith productsliketheAppleIIandNintendoEntertainmentSystem.

IBMenteredthePCmarketin1981usingthemorecomplexIntel8088CPU.ThisCPU waspowerfulandflexiblewith16-bitaddressingandvariablelengthmachinecode instructions.Thisstartedatrendofsingle-chipCPUsaddingcomplexitywiththegoalof becomingmainframesonthedesktop Intelquicklyintroducednewchipswithmoreand moreadvancedfunctionalitiestoempower32-bitandthen64-bitprocessing,vector operations,memoryprotection,multi-tasking,andmore.Thisprocessaddedtothechip's complexityalongwiththeunderlyinginstructionset.

CompetitorssawthisandthoughttheycouldcompetewithIntel’sComplexInstruction SetComputers(CISC)byintroducingsimplifiedReducedInstructionSetComputers(RISC). Thesecomputerswouldn’thavethebaggageofmaintainingcompatibilitywitholderchips, theywouldstartoutat32-or64-bits Theirinstructionswouldbeafixedwidthandthere wouldbefewerofthemtoallowfasterinstructiondecoding Eachinstructionwouldrunin1 clockcycle.EarlyRISCprocessorsweretypicallyusedinhigh-endUNIXworkstations,so consequentlytheyneverachievedtheshipmentvolumeandeconomiesofscaletoeffectively competewithIntel.

In1982,AcornComputers,whichproducedtheBBCMicrocomputer,waslookingto upgradetheirlineofcomputersfromusingthenowaging6502 TheengineersatAcorndid notwanttomovetotheIntelarchitectureandbecomeanotherPCclone Instead,they

wantedthesimplicityofthe6502,butmodernized.Theytookthedaringstepofdesigning theirownCPU,calledtheARMCPUbasedontheRISCphilosophy.

IftheARMwasonlyusedinAcornComputers,itprobablywouldhavediedout.However, towardstheendofthe1990s,SteveJobsdecidedtousetheARMprocessorintheApple iPod Thereasonbeingthatbecauseofitssimplifiedinstructionset,anARMprocessor didn’tusemuchpower,andthisallowedlongerbatterylifeinaportabledevice

WiththesuccessoftheiPod,ARMreachedareasonableproductionvolumeformore researchanddevelopment(R&D),thenwiththeintroductionoftheiPhone,ARMusage explodedasARMprocessorsareusedinnearlyeveryphoneandtabletinproduction.Intel finallyhadcompetitionfromaRISCprocessor.

Today,mostIntelprocessorsimplementaRISCcorethatexecutestheIntelmachinecode usingmultipleRISCinstructions ARMhasbecomemorecomplexasitsupportsboth32and64-bitinstructionsusingdifferentformats Amajorcomplaintagainstbothisthattouse compatiblemachinecodewitheitherARMorIntelprocessorsrequiresexpensivelicensing agreementswiththeparentcompanies.

EnterRISC-V,anopenstandardsRISC-basedmachine,whereanyonecanproducea compatibleCPUwithoutpayinganyonelicensingfees.CreatinganewCPUmachine languageisexpensiveasyouneedhigh-levellanguagecompilersandoperatingsupport If youcreateaCPUthatexecutesRISC-Vinstructions,thenyoucanusethestandardRISC-V versionofLinuxandthestandardGNUlanguagetoolchainforcompilinghigh-level languages.TheRISC-Vprojectstartedin2010attheUniversityofCalifornia,Berkeley,and RISC-Visthefifthversionofthearchitecture.Itsupports32-,64-,and128-bitprocessors. Itisdesignedtorunoneverythingfrommicrocontrollerscostingpenniestosuperscalar supercomputerscostingmillions.We’vereachedapointwheremanyRISC-VCPUsand computersareappearing Thisbookwillexplorethearchitectureanddescribehowto programtheseRISC-VCPUsatthelowestmachinecodelevel

WhatYouWillLearn

YouwilllearnAssemblyLanguageprogrammingforRISC-VCPUsrunningin32-or64-bit mode EverythingyouwilllearnisdirectlyapplicabletoallRISC-Vdevicesfromthesmallest microcontrollerstothelargestsuperscalarsupercomputers.LearningAssemblyLanguage foroneprocessorgivesyouthetoolstolearnitforanotherprocessor,suchasARM processorstypicallyusedinmobiledevices.

Inalldevices,theRISC-Vprocessorisn’tjustaCPU,it’sasystemonachip.Thismeans thatmostofthecomputersareallononechip Whenacompanyisdesigningadevice,they canselectvariousmodularcomponentstoincludeontheirchip Typically,thiscontainsa RISC-Vprocessorwithmultiplecores,meaningthatitcanprocessinstructionsformultiple programsrunningatonce.Itlikelycontainsseveralco-processorsforthingslikefloatingpointcalculations,aGraphicsProcessingUnit(GPU),andvariouscommunications protocols.

TheRISC-Vinstructionsetismodular EachRISC-VCPUwillimplementasetofmodules toprovidethefunctionalityitsusersrequire Firstthereisabasemoduleconsistingofthe basicintegerinstructions Therearethreecommonbaseinstructionsets—onefor32-bit, onefor64-bit,andaslimmeddownsubsetofthe32-bitoneforminimalembedded processors.

Thebasesetprovidessufficientfunctionalitytoperformintegerarithmetic,logic, comparisons,andbranches.Thenadditionalinstructionsareaddedinoptionalmodules,for instance,integermultiplicationanddivisionareinthe“M”module Low-costembedded processorswillonlyimplementafewbasicmodules,whereasamorepowerfulCPU intendedtobeusedinafullLinux-basedcomputermightimplementadozenmodules.Table 1-1containsthethreemainbaseversionsoftheinstructionsetsthatarecoveredinthis book.

Table1-1 BaseInstructionSets

Name Description

RV32I BaseIntegerInstructionSet,32-bit

RV32E BaseIntegerInstructionSet(embedded),32-bit

RV64I BaseIntegerInstructionSet,64-bit

Table1-2containsthemaininstructionsetextensions.Foracompletelist,consultthe specificationspostedatriscv.org.

Table1-2 InstructionSetExtensions

Name Description

M StandardExtensionforIntegerMultiplicationandDivision

A StandardExtensionforAtomicInstructions

F StandardExtensionforSingle-PrecisionFloating-Point

D StandardExtensionforDouble-PrecisionFloating-Point

Zicsr ControlandStatusRegister(CSR)Instructions

Zifencei Instruction-FetchFence

G ShorthandfortheIMAFDZicsr Zifenceibaseandextensions

C StandardExtensionforCompressedInstructions

Workingatthislowlevelistechnicalandtime-consuming,sowhywouldaprogrammer wanttowriteAssemblyLanguagecode?

TenReasonstoLearnAssemblyLanguageProgramming

Mostprogrammerswriteinahigh-levelprogramminglanguagelikePython,C#,Java, JavaScript,Go,Julia,Scratch,Ruby,Swift,orC Thesehighlyproductivelanguagesareused towritemajorprogramsfromtheLinuxoperatingsystemtowebsiteslikeFacebook,to productivitysoftwarelikeLibreOffice.Ifyoulearntobeagoodprogrammerinacoupleof these,youcanpotentiallyfindawell-payinginterestingjobandwritesomegreatprograms. Ifyoucreateaprograminoneoftheselanguages,youcaneasilygetitworkingon numerousoperatingsystemsonmultiplehardwarearchitectures.Youneverhavetolearn thedetailsofallthebitsandbytes,andthesecanremainsafelyunderthecovers WhenyouprograminAssemblyLanguage,youaretightlycoupledtoagivenCPUand movingyourprogramtoanotherrequiresacompleterewriteofyourprogram Each AssemblyLanguageinstructiondoesonlyafractionoftheamountofwork,sotodoanything takesalotofAssemblystatements.Therefore,todothesameworkas,say,aPython programtakesanorderofmagnitudelargeramountofeffort,fortheprogrammer.Writing inAssemblyLanguageisharder,asyoumustsolveproblemswithmemoryaddressingand CPUregistersthatareallhandledtransparentlybyhigh-levellanguages Sowhywouldyou wanttolearnAssemblyLanguageprogramming?

Hereare10reasonstolearnanduseAssemblyLanguage:

1. Towritemoreefficientcode:Evenifyoudon’twriteAssemblyLanguagecode, knowinghowthecomputerworksinternallyallowsyoutowritemorestreamlined code Youcanmakeyourdatastructureseasiertoaccessandwritecodeinastyle thatallowsthecompilertogeneratemoreeffectivecode Youcanmakebetteruseof computerresources,likeco-processors,andusethegivencomputertoitsfullest potential.

2. Towriteyourownoperatingsystem:Thecoreoftheoperatingsystemthat initializestheCPUhandleshardwaresecurityandmulti-threading/multi-tasking requiresAssemblycode

4

5.

Tocreateanewprogramminglanguage:Ifitisacompiledlanguage,thenyou needtogeneratetheAssemblycodetoexecute.Thequalityandspeedofyour languageislargelydependentonthequalityandspeedoftheAssemblyLanguagecode itgenerates.

Tomakecomputers runfaster:ThebestwaytomakeLinuxfasteristoimprove theGNUCCompiler.IfyouimprovetheRISC-VAssemblyLanguagecodeproducedby GNUC,theneveryprogramcompiledbyGCCbenefits.

Tointerfaceacomputertoahardwaredevice:Wheninterfacingacomputer throughUSBorGPIOports,thespeedofdatatransferishighlysensitiveastohow fastaprogramcanprocessthedata Perhaps,therearealotofbit-levelmanipulations thatareeasiertoprograminAssemblyLanguage

6

7.

8.

9.

10

Todofastermachinelearningor3D graphics programming:Bothapplications relyonfastmatrixmathematics.IfyoucanmakethisfasterwithAssemblyand/or usingtheco-processors,thenyoucanmakeAI-basedrobotsorvideogamesthatmuch better.

Toboostperformance:Mostlargeprogramshavecomponentswrittenindifferent languages Ifaprogramis99%C++,theother1%couldbeAssembly,perhapsgiving aprogramaperformanceboostorsomeothercompetitiveadvantage

Tocreateanewsingle-boardcomputer:NewboardshavesomeAssembly Languagecodetomanageperipheralsincludedwiththeboard.Thiscodeisusually calledaBIOS(basicinput/outputsystem).

Tolookforsecurityvulnerabilities inaprogramorpieceofhardware:Lookat theAssemblycodetodothis,otherwiseyoumaynotknowwhatisreallygoingon,and hencewhereholesmightexist

TolookforEastereggs inprograms:Thesearehiddenmessages,images,or insidejokesthatprogrammershideintheirprograms.Theyareusuallytriggeredby findingasecretkeyboardcombinationtopopthemup.Findingthemrequiresreverse engineeringtheprogramandreadingAssemblyLanguage.

NowthatwehavesomebackgroundonAssemblyLanguage,we’lllookatsomechoices forrunningRISC-VAssemblyLanguagecode

RunningProgramsonRISC-VSystems

DuetothemodularnatureofRISC-V,therearealotofpossibilitiesforrunningprograms Thisbookwillprovidedetailsonthefollowingthreespecificsystems:

1. RISC-V-basedLinuxcomputersuchas theStarfiveVisionfive2:Thisisthe easiestwaytoplaywithRISC-VAssemblyLanguage,sinceeverythingisdoneonthe samecomputer TheCPUontheVisionfive2boardsupportstheRV64GCsetofRISC-V extensions.

2. RISC-VsimulatorrunningonanIntel/AMD-basedWindows orLinuxcomputer: NoteveryonehasaRISC-Vcomputeryet,butdon’tletthatstopyou.Youcansimulate RISC-VrunningfullLinux.

3. RISC-Vmicrocontroller:TherearemanyofthesesuchastheEspressifESP32-C3 DevKit Firstofall writeaprogram thencompileitonanothercomputer suchasa

DevKit.Firstofall,writeaprogram,thencompileitonanothercomputer,suchasa Linuxlaptop,andfinallydownloadthecompiledprogramtothemicrocontrollertorun

ThisisanimportantusageofRISC-VAssemblyLanguage,butyouwillbelimitedtoa fewbasicinstructionmodules,namely,RV32IMC.

Therearemanyotherpossibilitiesthatalsowork,butyouwillneedtoadaptthe instructionsforthesupportedsystems Next,welookathowtosetupeachoftheseto assembleandrunasimpleAssemblyLanguageprogramtoprintout“HelloRISC-VWorld!”

CodingaSimple“HelloWorld”Program

Computersoperateonbinarydataconsistingofzerosandones;however,humansdonot thinkthisway.Asaresult,humansdeveloptoolstoassistusininteractingwithcomputers. OnesuchtoolistheGNUAssemblerwhichtakesahumanreadableversionofanAssembly LanguageprogramandconvertsittothezeroesandonesthattheRISC-Vprocessor understands.Inthissection,wewillpresentasimpleprogramwithoutgoingintodetail.The detailswillbefilledinoverthefollowingchapters Inthischapter,we’lltaketheprogram andlookatseveralwaysofAssemblingandrunningit First,we’lllookatrunningitonthe StarfiveVisionfive2SBCunderLinux.

HelloWorldon the Starfive Visionfive 2

ThestateofLinuxonRISC-Vcomputersisevolvingquickly Atthetimeofwritingthisbook, theDebianLinuxinstallimagefortheStarfiveVisionfive2computerisquiteminimaland doesnotevenincludeawebbrowser.PleasefollowtheinstructionsinitsQuickStartGuide forthemostup-to-dateinformation.Theseinstructionswillalsogiveanideaofwhatis requiredforotherRISC-V-basedLinuxSBCs.

Atthetimeofthewritingofthisbook,thesearetheinstructionstosetuptheVisionfive

2 ThestepsaregiveninmoredetailintheVisionfive’sQuickStartGuide TheVisionfive canrunLinuxfromamicroSDcard,anM2SSDdrive,orfromitsinternalfirmware Beforeyoustart,youwillneedthefollowing:

TheStarfiveVisionfive2board,USBkeyboard,USBmouse,andHDMIcapablemonitor AnmicroSD(SecureDigital)card Aburnerprogram,likeBalenaEtcher SecureShell(SSH)program QuickStartGuide Internetconnection

First,configuretwodipswitchesonthemotherboardtobootfromthepreferreddevice TheseinstructionsfollowwhatisneededtobootfromamicroSDcard,butaslongasthe correctinstructionsarefollowed,youcanrunLinuxfromanysupportedconfiguration.

1. ConfigurethetwodipswitchestoeMMC.

2

DownloadtheDebianLinuximageforanSDcardfromStarfive’swebsite: https://debian.starfivetech.com/ Next,burnitontoanSDcardusingaprogram likeBalenaEtcher.

3. PlacetheSDcardintheVisionfive2andturntheVisionfiveon.

4. IfyouareusingahardwiredInternetconnection,youcanskipthisstep.Whenitboots toLinux,login,thepasswordis“starfive”RuntheSetupprogramandselectyourWifi andenterthepassword

5. Sincethebaseimagedoesn’tcontainawebbrowser,itiseasiesttoperformthe followingstepsusingSSHfromahostcomputeronthesameWifinetwork.Thiswayyou cancopy/pastecommandsfromtheQuickStartGuideintotheSSHprogram.Use “ t fi l l” th h t

6

“starfive.local”asthehostname.

ssh user@starfive.local

Next,thefilesystemneedstoberesized Ifyoudon’tdothis,youcan’tinstallany programs,sincethebaseimagehaslittlefreespace Thisisatechnicalstepandyou shouldfollowtheinstructionsfromtheQuickStartGuidecarefullyasyouaredeleting andrecreatingdiskpartitions.

7. Nowweperformthelongstepofinstallingtheextrasoftwarethatincludesweb browsersandthedevelopmenttoolsrequiredforthisbook.Usethescpcommandto copythe“install_package_and_dependenciessh”scripttothecomputerandrunit Enterthescpcommandfromthehostcomputer:

scp install package and dependencies.sh user@starfive.local:/home/user

8. ThenthefollowingcommandsfromtheSSHremotesession.

chmod +x install package and dependencies.sh ./install package and dependencies.sh

Runningthistakesseveralhours,soit'sagoodtimetogoforlunch.Afterthisscript completes,reboottheVisionfive2.

9. PartofthepreviousshellscriptinstallstheGNUdevelopmenttools.Ifusingadifferent LinuxdistributionofSBC,thismayneedtobedonemanuallyusingthecommand:

sudo apt install build-essential

10. Afterthecomputerreboots,loginnormally.Therearenowwebbrowsers,officetools, andsoftwaredevelopmenttools.

11. InstallasimpleGUItexteditortouseforprogramming.Useaterminal-basedtext editorlikeviifyouwish.GEditisagoodsimplechoicethatcanbeinstalledwiththe followingcommand:

sudo apt install gedit

Withthecomputersetup,wearereadytowrite,assemble,andrunasimple“Hello World”program.Inthischapter,wewon’tworryaboutthedetailsofhowthisprogram works,ratherweareensuringwecanassemble,link,andrunprograms.Wewillexamine howeverythingworksindetailinthefollowingchapters

EitherdownloadthesourcecodefromtheApressGithubsiteortypeintheprogramin Listing1-1andsaveitasHelloWorld.S,wherecapitalizationisimportant.

#

# Risc-V Assembler program to print "Hello RISC-V World!"

# to stdout

#

# a0-a2 - parameters to linux function services

# a7 - linux function number

#

.global start # Provide program starting address to linker

# Setup the parameters to print hello world # and then call Linux to do it.

start: addi a0, x0, 1 # 1 = StdOut

la a1, helloworld # load address of helloworld addi a2, x0, 20 # length of our string addi a7, x0, 64 # linux write system call ecall # Call linux to output the string

# Setup the parameters to exit the program # and then call Linux to do it.

addi a0, x0, 0 # Use 0 return code addi a7, x0, 93 # Service command code 93 terminates ecall # Call linux to terminate the program

.data helloworld: .ascii "Hello RISC-V World!\n"

Listing1-1 TheLinuxversionoftheHelloWorldprogram

Anythingafterahashsign(#)isacomment Thecodelinesconsistofanoptionallabel, followedbyanopcode,possiblyfollowedbyseveralparameters.Tocompileandrunthis program,createafilecalledbuildthatcontainsthecontentsofListing1-2:

as -o HelloWorld o HelloWorld S ld -o HelloWorld HelloWorld.o

Listing1-2 BuildfileforHelloWorld

Aftersavingthebuildfile,convertittoanexecutablefilewiththefollowingcommand: chmod +x build

Nowcompiletheprogrambyrunningthebuildfileandthentheresultingexecutable programwithfollowingcommands: ./build ./HelloWorld

Figure1-1showstheresultofrunningthis.bash-xisusedtoshowthecommandsbeing executed.

Figure1-1 CompilingandrunningtheHelloWorldprogram

We’venowwrittenandexecutedourfirstAssemblyLanguageprogram.Next,let’slook atrunningHelloWorldonaRISC-Vemulator.

Another random document with no related content on Scribd:

aivonsa ovat liiaksi rasittuneet. Mutta Heikin luo hän voi hiipiä silloin kun tämä nukkuu. Ei hän muuta kuin silittää hiljaa sänkistä poskea ja palaa sitten takaisin. Heikki on niin hyvä, mutta hänellä on syytä olla sellainen kuin on.

Ja hän nousee kuin varas vuoteeltaan.

Mutta Heikki ei nuku. Huoneessa on vielä valo, ja harmaja, totinen katse kohtaa vaimon säikähtyneet silmät. Helmi pysähtyy epätietoisena ovelle.

"Minä luulin, että sinä nukuit jo", sanoo hän.

Suontaan Heikillä ei ole aavistustakaan siitä, mitä Helmin käynti tarkoittaa. Hän tuntee melkein kammoa eikä vastaa mitään.

"Kun et sinä nuku", jatkaa Helmi, "niin saanko minä istua?"

"Istu. Vaikka parempi olisi, kun olisit levolla."

"En minä, Heikki, enää saa nukutuksi."

"Hm."

"Saanko haudassakaan."

"Miks'et saisi?"

"Kyllä sinä tiedät."

"Olen jo lukemattomia kertoja pyytänyt, ettet millään tavalla muistuttaisi siitä asiasta."

"Mutta muistan sen kuitenkin. Ja sinä myöskin."

"Vaan en muistuta."

"Sinä olet hyvä. Kuule, voitko koskaan antaa minulle anteeksi?"

Miehen huulet puristuvat yhteen. Se pienikin hellyys, jota hän on tuntenut, katoaa tyyten.

"Olemmehan jo sopineet, ettemme siitä enää puhu."

"Kuule, tahtoisitko, että olisin kuollut." c

"En."

"Mutta jos menisin pois jonnekin. Jos sinun on vaikea minun kanssani."

"Ei ole."

"Sinä et vain oman kunniasi takia ottanut minusta eroa."

"Tahtoisitko sinä sitten eron?"

"Jos olen sinulle vaivaksi."

"Sanoinhan jo, ettet ole."

"Ja sinähän voit ruveta rakastamaan jotakin…"

"Surettaisiko se sinua."

"Tahtoisin vain, että sinun olisi hyvä."

"Kyllä sanon sinulle, jos löydän toisen. Silloinhan on täysi aihe eroonkin."

"Sitten minä haluaisin vielä kysyä sinulta yhtä asiaa. Et suinkaan sinä vihaa lasta?"

"En kai." — Ja Suontaan Heikki naurahtaa. — "Kuinka minä sitä voisin vihata? Syytönhän se raukka on. Ja voisihan se olla minunkin."

Enempää ei Helmi enää voi kuulla. Itku tulee melkein väkisin. Hän toivottaa hätäisesti hyvää yötä ja menee huoneeseensa.

Mutta sinä yönä hän vielä vähemmän kuin ennen sai unta.

Leudot ja alakuloisen harmajat syystalven päivät vaihtuvat sentään lopultakin vähitellen pakkasiksi. On jo hyvä aikakin, sillä tärkeät vetämiset ovat taloissa vielä vetämättä ja nyt kulkevat heinä- ja halkokuormat pitkin maantietä kivistyneen lumen vinkuessa reen jalaksia vastaan. Ja on toinenkin syy: joulu on pian lähettyvillä. Kansan mielikuviin ei sisälly lumeton joulu.

Suontaan Heikki valjastaa hevostansa. Hänen on mentävä kaupunkiin ostoksille ja muillekin asioille. Mielessään hän tuntee omituista levottomuutta ja rauhattomuutta aivan kuin olisi hänellä kovin kiire ja kuin odottaisi hän jotakin. Helmille hän ei ole puhunut lähdöstään mitään, mutta kun hevonen jo on aseissa ja kun hän jo on pukenut turkit ylleen ja vyöttänyt itsensä, menee hän sisälle.

"Lähtisitkö sinä mukaan?" kysyy hän Helmiltä.

"Menetkö sinä jonnekin?"

"Kaupunkiin."

"En kai, en minä tiedä."

Helmin siniset silmät saavat kuumeisen, poissaolevan ilmeen, ja hän empii silminnähtävästi. Mutta viimein hän ratkaisee asian:

"En minä lähde."

Heikki seisoo vielä hetken paikallaan kuin aikoisi pyytää Helmiä toisen kerran, mutta painaa sitten lakin päähänsä ja rientää portaita alas. Hän tuntee itsensä jollakin tavalla keventyneeksi ja vapautuneeksi, mutta samalla jää häntä vaivaamaan Helmin vaivautunut, tuskallinen katse.

Tultuaan Ranta-Konkkalan kohdalle Heikki hiljentää vauhtia. Hänen katseensa on kuin jonnekin haihtunut ja hän muistelee nyt toista, kimaltelevaa ja kiehtovaa. Mutta sittenkin hän ajaa ohi. Sillä hänen mieleensä tulee taas Helmi sellaisena kuin tämä oli voimainsa päivinä.

Heikin tapoihin ei kuulu ilman aikojaan viivytellä kaupungissa. Toimittaa mitä on toimittamista, pitää huolen siitä, että hevonen saa kunnollisesti levätä, ja palaa takaisin sitten. Mutta tällä kertaa toimet sujuvat verkkaisesti ja viivytellen. Koskaan ei hän muista olleensa siinä mielentilassa asioilla ollessaan, ei edes silloin kun Helmi oli sairaalassa.

"Onko minulla suru?" kysyy hän itseltään. Mutta sitä, mikä surua tavallisesti seuraa, tuskallinen ja pakahduttava, alaspainava tunne, sitä hän ei tunne. Päinvastoin hänestä tuntuu siltä, kuin hänet olisi hylätty ja yksin heitetty keskelle tätä hyörinää ja kuin hänellä olisi valta mennä mihin ikinä hän tahtoo.

"Mikähän siinä on", ajattelee hän itsekseen, "että ne, joille sattuu jokin kolahdus, melkein aina rupeavat juomaan".

Heikki ei jaksa ymmärtää, mitä sellainen merkitsee. Hän ei ole koskaan maistanut väkeviä, eikä hänestä ole minkään näköistäkään, kun ihminen on silmät sameina ja kontturoi sinne ja tänne. Mutta kai viinassa täytyy olla jotakin, joka lämmittää ja antaa puhtia ja heilahdusta ajatusmeiningille. Ja kun saisikin ajatuksen päästä kiinni, niin sittenhän se jotakin olisikin. Välipä tuolia, vaikka olisikin hiukan päissään.

Oikeastaan Suontaan Heikkiä pohjimmaltaan kammottaa koko viina, josta hän ei tiedä mitään hyvää. Eikä hän ole niitä miehiä, jotka tietävät, mistä sitä on otettavissa.

Mutta silloin hän muistaa erään kasvinkumppanin, jolla on virka kaupungissa, ja menee hänen luokseen.

Toinen purskahtaa röhönauruun kuullessaan asian, jonka Heikki puoliujosti esittää.

"Mitä sinä sillä tekisit?" nauraa hän.

"Ajattelen, että olisi hyvä olemassa sairauden varalta."

"Kyllä kans. Etpä sinä niitä miehiä ole ennen ollut."

"Enkä tulekaan, mutta tarve on tarve."

Eihän siinä sen pitempiä ole. Toinen lähtee asialle ja Heikki jää odottelemaan.

Kun Suontaan Heikki seuraavana aamuna ajelee kotiin päin, ei hän tahdo tuntea maailmaa entiseksi. Aamu on jo pitkälle kulunut ja päivä vaikuttaa odottamattoman kirkkaalta, mutta sittenkin hänestä tuntuu, kuin kaiken takana olisi jotakin painostavaa ja uhkaavaa. Kääntäessään tullista maantielle on hänen vilkaistava taakseen, on aivan niinkuin joku häntä seuraisi.

Eikä hän ole sairas eikä tunne tehneensä mitään, jota olisi pakko katua. On vain koettanut sitä, mitä viisaat ihmiset sanovat murheeseen ryyppäämiseksi, on koettanut, mutta on epätietoista, tuleeko koettamaan enää. Sillä eipä tuo niin erinomaiselta ollut tuntunut: suu vain kävi vilkkaammin kuin tavallisesti ja monet asiat olivat unohtuneet ja näyttäneet valoisammilta kuin tavallisesti, mutta pohjalla oli asunut tietoisuus siitä, että nyt minä olen humalassa, mutta kylläpä tästä selviänkin.

"Joo", sanoo hän itsekseen, "ryypätä murheeseen, tiedetään kyllä sekin".

Onko hänellä sitten murhe? Murhe kai on jotakin sellaista, joka tekee alakuloiseksi ja raskasmieliseksi, niinkuin silloin kun joku

omainen kuolee tai on saattanut asiansa huonosti eikä voi niitä auttaa. Mutta hänestä tuntuu vain, kuin olisi hän siinä pisteessä, mistä alkuaan on lähtenytkin, ypöyksinään ja autiuden ympäröimänä, autiuden, jolle ei näy äärtä eikä rajaa. Lukemattomia kertoja on hän koettanut tätä kysymystä itselleen selvittää, yhtä monesti on hän tullut tähän samaan johtopäätökseen. Ja turhaa oli sitä sen enempää vatvoskellakaan. Häntä oli vain rakkaudettomasti petetty, sitten kai häntä oli ruvettu rakastamaankin, mutta nyt kun hän etsi omaa rakkauttansa, ei hän sitä enää löytänyt. Siinä on sitten sinun murheesi. Suontaan Heikki haukottelee ja tuntee itsensä väsyneeksi. Onkohan sekin viinan vaikutusta vai liekö muuta. Tässä hän nyt vain ajelee kotiin päin.

"Jos sinua sitten matkalla rupeaa ramaisemaan tai muuten tekemään pahaa, niin kumaise tästä itseesi paremmanpuoleinen tujaus. Niin myös jos muuten tunnet itsesi alakuloiseksi tai surunvoittoiseksi."

Suontaan Heikin suu vetäytyi hymyyn. Sai kai häntä neuvoa niin tässä niinkuin muissakin asioissa. Mutta antaapahan pullon vielä olla koskemattomana.

Matka kuluu, mutta kuluu hitaasti. On tämäkin nyt merkillistä velttoutta ja ryhdittömyyttä, ettei saa edes hevostaan hoputetuksi. Mutta Suontaan Heikki lojuu reen perällä kuin horroksissa ja antaa hevosen mennä miten se itse haluaa. Ennätetäänpähän tästä toki vähemmälläkin.

Vasta lähestyessään Ranta-Konkkalaa hän ikäänkuin herää. Päivä on jo aikoja sitten sivuuttanut puolen, alkaa jo pimetäkin, ja taloista näkyvät tulet.

Heikillä ei ole mitään asiaa taloon, mutta hän vakuuttaa itselleen, että hevonen tarvitsee hiukan heiniä ja vähän levätäkin. Sittenpä juoksee nopeammin loppumatkan. Kovin hidasta onkin tulo ollut.

Mutta mitenkä, — huomaavatkohan, että hän on ollut vähin hummausmatkalla? Kun hän ajattelee tätä, tulee samalla mieleen, etteipä tuo huomio niin erikoisesti hänen arvoaan alentaisikaan, pikemminkin se vähän niinkuin kuuluu asiaan.

Äkillistä päähänpistoa noudattaen Suontaan Heikki vie käden povelleen ja vetää pullon esiin. Sehän oli juuri kuin sitä tarkoitusta varten. Ja kun kerran ihmisiin poikkeaa, niin saahan siellä edes jutella ihmisten tavoin, ettei istu ja jurnuta niinkuin puu-äijä.

Sitten hän varovasti kätkee pullon reen pohjalle, nykäisee ohjaksista ja kääntää kilisevin kulkusin valaistuun pihaan.

"Sinä tulet hiukan sopimattomalla aikaa", sanoi Ranta-Konkkalan Aili.

Mutta Suontaan Heikki ei huomaa ensinkään, mikä tässä olisi sopimatonta. Hän riisuu reippaasti turkit yltään ja hänestä näyttää, kuin koko laaja rakennus tulvehtisi valoa ja lämpöä.

"Minulla on se tapa", vastasi hän, "että aina tulen sopimattomalla ajalla. Siihen aikaan kun kuljin kosiomiehenä, kuulin joka kerta kun tulin, että olin tullut epäotollisena aikana."

Heikki säikähtää itsekin sanavuolauttaan. Nainen katsoo häneen kummastuneena, mutta sitten hänen silmiinsä ilmaantuu loistetta ja suu menee hymyyn.

"Vai sanottiin sinulle niin", naurahtaa hän. "Minä tarkoitin vain sitä, että äiti ja veli ovat molemmat kaupungissa. Kumma, ettet heitä nähnyt."

"En minä nähnyt", vastaa Heikki totuudenmukaisesti, "ja vaikka olisinkin, niin olisin sittenkin tullut".

"Vai niin", sanoo nainen hiljaisesti ja tällä kertaa kovin pitkään.

Hänen poskensa punastuvat hiukan, mutta omituinen, hillitty loiste viipyy hänen silmissään ja hän kääntää katseensa pois. Sitten hän kysyy:

"Oliko sinulla sitten joitakin asioita?"

Heikki tuntee, että katse taas on pysähtynyt häneen. Mutta muutaman minuutin kuluessa oli hänen nouseva mielenvireensä merkillisellä tavalla laskeutunut, hän tuntee itsensä avuttomaksi ja epävarmaksi eikä keksi mitään vastausta. Nainenkin huomaa tämän muutoksen, ja hänen äänessään on ilkamoiva sivusävy, kun hän sanoo:

"Minä tiedän, että olet pitkälti ajatteleva mies. Mietiskele nyt sillä aikaa kun käyn sanomassa kahvista."

Mutta Suontaan Heikki painaa lakin päähänsä ja menee ulos.

"Mikä helvetin nauta minä olen", ajattelee hän itseksensä. "Ja olen aina ollut."

Vaan mitä hän tänne ulos oli oikeastaan tullut! Nyt se palautui hänen mieleensä: pullo. Saattaahan se joskus olla siunattu keksintö sekin. Ja hän puuhailee innokkaasti reen luona ja palaa yskien huoneeseen.

"Kävin antamassa hevoselle heiniä", selittää hän hyvin asiallisesti.

"Luulin, että jo äsken annoit. Ja olisinhan voinut sanoa siitä miehille."

"Suotta vain heille vaivaa."

"No niin sitten. Otapas kahvia."

Suontaan Heikki tuntee, että käden ja sormien liikkeet ovat vähän epävarmat. Mutta samalla hänestä tuntuu myöskin siltä, kuin äskeinen valo, lämpö ja turvallisuuden tunne olisivat palanneet. Ala vaan kysellä, Ranta-Konkkalan Aili!

Eikä hänen tarvinnut pitkiä aikoja odottaakaan. Naisen katse kiinnittyy taas häneen, katse, joka tällä kertaa on tutkiva ja hiukan kylmä.

"Sinun piti sanoa minulle jotakin."

Ääni on katseen vastakohta, pehmeä ja lämmin, melkein hyväilevä.

"Sanoit, että olisit joka tapauksessa tullut", kertasi hän. "Eikö se niin ollut?"

"Oli, niin se oli."

"Ja miksi?"

Suontaan Heikin veret ovat käynnissä. Hän voisi hyvin vastata: "olenhan täällä niin monesti ennenkin käynyt" tai jotakin siihen tapaan, mutta hän huomaa, että se tällä kertaa olisi liian vähän. Ja hän miettii yhä. Silloin hänestä tuntuu, kuin joku kuiskaisi vastauksen hänen korvaansa ja se vastaus tulisi kuulumaan seuraavasti: "syöttämään hevosta". Sanat ovat jo tulemassa hänen huuliltaan, mutta ennenkuin hän saa edes ensimmäistä tavua lausutuksi, niin hän jo kauhistuu. Niihin sisältyisi loukkaus ja ne ratkaisisivat hänen

suhteensa tähän taloon, mutta oliko hänellä varaa mitään menettää. Ei, mahtoikohan tuo paljon lisätä hänen syntitaakkaansa, jos hän sanoi asian niinkuin se todellisuudessa oli.

"Tulin vain nähdäkseni sinut", vastasi hän. Ranta-Konkkalan Aili ei tästä näy paljoa hämmästyvän. Värit hänen kasvoillaan käyvät ehkä tummemmiksi ja huulet puristuvat hetkeksi tiukempaan, mutta katseensa hän salaa alaspainuneiden luomien alle.

"Sinähän tiedät vallan hyvin", sanoo hän viimein, "että sinulla on nähtävyys kotonakin".

Suontaan Heikki ei nyt tunne itseään. Ei hän älyä, miksi hän suuttuu, eikä sitäkään, mistä niin pian löytää sanat vastatessaan:

"Siksipä juuri."

Mutta nyt nainen kohottaa katseensa ja hänen silmänsä näyttävät totisilta ja mustilta kuin pohjaton syvyys, kun hän kylmällä ja kirkkaalla äänellä sanoo:

"En ymmärrä mitä tarkoitat."

Ja kun Suontaan Heikki ei vastaa, lisää hän:

"Luulen, että kyllä Saaren tyttäressä on pitämistä — kaikesta huolimatta."

Sitten hän nousee ikäänkuin aikoisi lähteä. Mutta otettuaan jo jonkin askelen ovea kohden hän vielä kääntyy ympäri.

"Tarkoitatko", kysyy hän, "ettet enää välittäisi vaimostasi?"

Suontaan Heikissä menee kaikki sekaisin. Millon ja missä välissä tähän on tultu? Ei, ei hän rakasta Helmiä, mutt'ei hän rakasta ketään muutakaan. Piru, kun kaikki käy ympäri, voi tuolla olla samanlainen historia takanaan. Kuinka se muuten niin kuluttaisi aikaansa hänen kanssaan? Mikä hän, Suontaan Heikki, muu on kuin lelu ja taitaa olla vähän herkkäuskoinen ja tyhmänsekainen siksikin.

Sillä hetkellä Suontaan poika tuntee vihaavansa itseään ja kaikkia muitakin. Mutta hänen katseensa tapaa taas naisen, suoran, ryhdikkään ja korkean. Koskaan tuo nainen ei ole tehnyt hänelle muuta kuin ollut hyvä ja hienotunteinen ja nytkin hän katsoo häneen lämpimästi ja kysyen. Onhan hänellä toki oikeus kysyä ja Heikillä valta olla vastaamatta, jos niin tahtoo. Aika kuluu, nainen odottaa, tuleeko vastausta ensinkään, Suontaan poika sitä miettii. Huone tuntuu hänen silmissään pimenevän ja käyvän ikäänkuin pienemmäksi ja kylmemmäksi, lopulta jää hän tarkoituksettomasti tuijottamaan naista.

Hän aikoo vastata:

"En rakasta Helmiä, mutt'en ketään muutakaan."

Ja kuitenkin se jää sanomatta. Hänen täytyy vain katsoa, katsoa niinkuin ei olisi edessään seisovaa naista koskaan ennen nähnyt.

Viimein Ranta-Konkkalan tytär näyttää riistäytyvän irti jostakin vaivaavasta ajatuksesta, ja hänen äänellään on erikoinen sävy, kun hän taas kysyy:

"Kuulepas, Heikki. Sano minulle yksi asia, sanotko?"

"Minä koetan."

"Sano minulle vain, oletko hairahtunut maistamaan kaupungissa."

"Kyllä kai, mutta…"

"Mutta mitä?"

"Oletko siitä kovin vihainen?"

"En minä siitä pidä, mutta toiselta puolen, kun niin täytyi tapahtua, ihmettelen ettet ole tehnyt sitä jo aikaisemmin."

* * * * *

Mitähän Luojan nimessä tämä oikein merkitsi! Sanoiko hän lisäksi: "Voi miesparka!"

Taisi sanoa, taisi olla sanomattakin, saattoi olla jotakin muutakin lisäksi. Mikä muistaja hän on! Hän näkee vain punehtuvat posket ja liekehtivät silmät ja tuntee, kuinka hänen huulensa kuin ohimennen hipaisevat naisen poskea. Suontaan Heikki havahtuu vasta kun hän kuin takaa-ajettuna kiidättää pitkin maantietä.

Pitikö hänen nyt kiittää Luojaa vaiko pirua!

Saaren talon ympärille ei ole päässyt muodostumaan pikkuasumuksia. Joku tönö vain vainioiden ulkolaidassa, joka ainoastaan alleviivaa talon suuruutta ja yksinäisyyttä, sitten on vain yhtä ainoata Saarta maantiestä metsänreunoille, järvenrantaan ja Sarvakon kylään asti. Kaupungista päin tultaessa mahtuu Saaren rakennusryhmä näkymään kauas maantielle, ja kun Heikki kääntyy taloon johtavalle kujalle, huomaa hän muutamissa talon ikkunoissa tulet.

Hän ei tällä kertaa ollenkaan välittäisi siitä, että häntä odotetaan.

Eihän hän kyllä ole tehnyt mitään, jota hänen tarvitsisi hävetä, mutta sittenkin hän nyt veisi hevosen talliin kaikessa hiljaisuudessa ja jakaisi ostokset aamulla.

Pihalla on hiljaista ja autiota, onkin tainnut jo mennä yö sivu puolen. Hän saa hakea avaimet sisältä, huoltaa hevosen ja itse kantaa sisään tavaransa.

Sitten hän aikoo ilman muuta mennä huoneeseensa.

* * * * *

"Vai niin. Joko sinä tulit?"

"Jo."

"Minä olen pitänyt sinulle illallista."

"Kiitos vain, mutta sitä vartenhan olisivat olleet palvelijat."

Heikki ei tahtoisi olla Helmille ynseä, mutta nyt hänen valvomisensa ja huolehtimisensa häntä tuskastuttaa.

"Uni sinulle olisi ollut kaikkein paras", sanoo hän. "Älä vasta ainakaan minun takiani valvoskele."

"Aika oli niin myöhäinen, etten voinut palvelijoitakaan pitää ylhäällä.

Ja kyllä minä mielelläni valvon."

Helmin nöyryys liikuttaa ja suututtaa Heikkiä, tekee hänet aseettomaksi. Mitä hänellä on sanomista, — jos tahtoisikin sanoa, — kun toinen aina ehtii edelle. Onko se nyt sitten oveluutta vai katumusta?

"Etkö sinä syö?" kysyy Helmi.

"Ei minun ole nälkä", vastaa mies ärtyisästi.

"Kuule… tuota… eikö minun laittamani ruokakaan sinulle kelpaa?"

Se tulee kuin nyyhkytys, mutta vaikuttaa mieheen yhtä vähän kuin kuuroon. Pitkiä aikoja kuluu hiljaisuuden vallitessa. Mutta sitten Heikki nousee lähteäkseen ja hänen katseensa iskeytyy tuimana Helmiin.

"Sanon sinulle vain yhden asian, Helmi", sanoo hän miltei vavisten, "ja se on se, että heitä pois tuo vetinen nöyryys ja tuo pelko ja passaileminen".

Helmi tahtoisi heittäytyä miehensä kaulaan tai vaikka jalkoihin, mutta hänen on tyydyttävä nielemään kyyneleensä.

"Enhän minä tahdo olla sinulle paha", jatkaa Suontaan Heikki, "mutta joka kerta kun näen surkean ilmeesi, muistuu mieleeni jotakin. Minun on vaikea sitä sanoa, mutta enhän voi uskoa sinua. Miks'et voi olla niinkuin ennenkin?" Saaren Helmi purskahtaa itkuun. "Rukoilen Jumalaa, että vielä uskoisit", nyyhki hän.

Suontaan Heikki on jo ovella menossa, mutta siinä hän pysähtyy.

"Parasta on rukoilla, että se tapahtuisi aikanaan", sanoo hän, toivottaa hyvää yötä ja sulkien oven.

* * * * *

Mutta kun hän heittäytyy vuoteelleen, ei hän saa unta silmiinsä. Hänestä tuntuu kuin olisi hän tehnyt moninkertaisesti huonosti. Olihan hänellä oikeus olla uskomatta Helmiä, oli totisesti, mutta hänen ei ollut pakko mennä sitä sanomaan. Jos olikin oikeus olla rehellinen, niin silti ei tarvinnut lisätä toisen tuskia. Mikä mies hän lopultakaan oli sanomaan, miten suuret ne olivat. Eikä hän voinut muuta kuin nousta ja mennä Helmin luo.

"Ei se äskeinen ollut niin pahasti tarkoitettu", sanoi hän lempeästi, "niin että älä siitä välitä".

"En toki", ja vaimo hymyilee kyyneltensä läpi, "onhan sinulla oikeuskin…"

Oikeuskin! Tähän ei miehellä enää ollut mitään sanomista. Siinä hän seisoi sanattomana ja neuvottomana.

"Hyvää yötä", sanoo hän taas, mutta se tulee niinkuin hän olisi tahtonut sanoa enemmänkin, mutt'ei keksinyt mitä sanoa.

Kun hän toisen kerran sulkee oven, tietää hän edeltäpäin, että ellei hän pääse selvyyteen ajatuksistaan, ei hänen tarvitse unta tänä yönä havitellakaan.

Tapaninpäivänä ajelee Suontaan äijä Saareen. Hän on pukeutunut parhaimpiinsa ja kasvoiltaankin hän on ajellut sängen pois, mutta sittenkin näyttää siltä, kuin loistaisi vahingonilo hänen naamastaan ja hänen puhetapansa on vielä kiertelevämpää ja hänen äänensä vielä kitsaampi ja vikisevämpi kuin ennen.

Ja hän karttaa tulemasta pääasiaan. Hän syö aamiaista hyvällä ruokahalulla, juo kahvia päälle, juttelee päättymässä olevasta vuodesta ja on huolissaan Saaren vanhan emännän terveydestä.

"Oltiinko teiltä joulukirkossa?" kysyy hän.

"En sattunut huomaamaan."

"Helmi ja Heikki siellä olivat. Taisi väestäkin olla joku."

Vai Helmi ja Heikki. Tämä ei ollenkaan soveltunut Suontaan äijän asioihin. Mutta hän puhuu edelleenkin. Ei se joulukirkkohommakaan ole niinkuin ennen. Kokoontuvat sinne lehterille vain, pirkaleet, juttelemaan saarnan ajaksi eivätkä kuuntele sanaa.

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.