100% found this document useful (2 votes)
54 views64 pages

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

The document is a promotional overview of the book 'RISC-V Assembly Language Programming' by Stephen Smith, which focuses on programming RISC-V CPUs using assembly language. It highlights the benefits of RISC-V's open-source instruction set and provides a comprehensive guide to learning assembly programming, including practical applications and tools. Additionally, it introduces the Maker Innovations series, which aims to equip readers with skills in hardware design and programming through hands-on projects.

Uploaded by

prong3buzispm
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (2 votes)
54 views64 pages

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

The document is a promotional overview of the book 'RISC-V Assembly Language Programming' by Stephen Smith, which focuses on programming RISC-V CPUs using assembly language. It highlights the benefits of RISC-V's open-source instruction set and provides a comprehensive guide to learning assembly programming, including practical applications and tools. Additionally, it introduces the Maker Innovations series, which aims to equip readers with skills in hardware design and programming through hands-on projects.

Uploaded by

prong3buzispm
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 64

RISC-V Assembly Language Programming: Unlock the

Power of the RISC-V Instruction Set (Maker


Innovations Series) 1st Edition Smith download

https://textbookfull.com/product/risc-v-assembly-language-
programming-unlock-the-power-of-the-risc-v-instruction-set-maker-
innovations-series-1st-edition-smith/

Download more ebook from https://textbookfull.com


We believe these products will be a great fit for you. Click
the link to download now, or visit textbookfull.com
to discover even more!

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-language-
programming-unlock-the-power-of-the-risc-v-instruction-set-maker-
innovations-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-set-
manual-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-and-
design-the-hardware-software-interface-risc-v-edition-david-a-
patterson/

Computer Organization and Design RISC V Edition The


Hardware Software Interface David A. Patterson

https://textbookfull.com/product/computer-organization-and-
design-risc-v-edition-the-hardware-software-interface-david-a-
patterson/
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-architecture-
and-organization-learn-x86-arm-and-risc-v-architectures-and-the-
design-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-peace-
conference-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-and-
circuits-may-01-2011-jagannathan-v-2nd-edition-jagannathan-v/

Parallel Computers Architecture and Programming V.


Rajaraman

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

Literacies and Language Education 3rd Edition Brian V.


Street

https://textbookfull.com/product/literacies-and-language-
education-3rd-edition-brian-v-street/
Maker Innovations Series

Jump start your path to discovery with the Apress Maker


Innovations series! From the basics of electricity and
components through to the most advanced options in
robotics and Machine Learning, you’ll forge a path to
building ingenious hardware and controlling it with cutting-
edge software. All while gaining new skills and experience
with common toolsets you can take to new projects or even
into a whole new career.
The Apress Maker Innovations series offers projects-
based learning, while keeping theory and best processes
front and center. So you get hands-on experience while also
learning the terms of the trade and how entrepreneurs,
inventors, and engineers think through creating and
executing hardware projects. You can learn to design
circuits, program AI, create IoT systems for your home or
even city, and so much more!
Whether you’re a beginning hobbyist or a seasoned
entrepreneur working out of your basement or garage, you’ll
scale up your skillset to become a hardware design and
engineering pro. And often using low-cost and open-source
software such as the Raspberry Pi, Arduino, PIC
microcontroller, and Robot Operating System (ROS).
Programmers and software engineers have great
opportunities to learn, too, as many projects and control
environments are based in popular languages and operating
systems, such as Python and Linux.
If you want to build a robot, set up a smart home, tackle
assembling a weather-ready meteorology system, or create
a brand-new circuit using breadboards and circuit design
software, this series has all that and more! Written by
creative and seasoned Makers, every book in the series
tackles both tested and leading-edge approaches and
technologies for bringing your visions and projects to life.
More information about this series at
https://link.springer.com/bookseries/17311.
Stephen Smith

RISC-V Assembly Language


Programming
Unlock the Power of the RISC-V
Instruction Set
Stephen Smith
Gibsons, BC, Canada

ISSN 2948-2542 e-ISSN 2948-2550


Maker Innovations Series
ISBN 979-8-8688-0136-5 e-ISBN 979-8-8688-0137-2
https://doi.org/10.1007/979-8-8688-0137-2

© Stephen Smith 2024

This work is subject to copyright. All rights are solely and


exclusively licensed by the Publisher, whether the whole or
part of the material is concerned, specifically the rights of
translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other
physical way, and transmission or information storage and
retrieval, electronic adaptation, computer software, or by
similar or dissimilar methodology now known or hereafter
developed.

The use of general descriptive names, registered names,


trademarks, service marks, etc. in this publication does not
imply, even in the absence of a specific statement, that such
names are exempt from the relevant protective laws and
regulations and therefore free for general use.

The publisher, the authors, and the editors are safe to


assume that the advice and information in this book are
believed to be true and accurate at the date of publication.
Neither the publisher nor the authors or the editors give a
warranty, expressed or implied, with respect to the material
contained herein or for any errors or omissions that may
have been made. The publisher remains neutral with regard
to jurisdictional claims in published maps and institutional
affiliations.

This Apress imprint is published by the registered company


APress Media, LLC, part of Springer Nature.
The registered company address is: 1 New York Plaza, New
York, NY 10004, U.S.A.
This book is dedicated to my beloved wife and editor
Cathalynn Labonté-Smith.
Introduction
The heart of every computer and smart device is a Central
Processing Unit (CPU). Historically, each CPU has been
produced by a single company which tightly controls the
instruction set and internal workings of the CPU. RISC-V
(pronounced Risk Five) is a new approach based on open-
source principles. Anyone can implement a RISC-V CPU
using a standardized instruction set without requiring any
special licensing or royalty payments. As a result, RISC-V
CPUs can be at a much lower cost than proprietary CPUs
and have exploded in the low-cost microcontroller space.
Now that more powerful RISC-V CPUs are appearing,
leading to Single Board Computers (SBCs) similar to the
Raspberry Pi, along with inexpensive low-end laptops and
tablets, this book presents the inner workings of typical
RISC-V CPUs and details the open-source Assembly
Language instruction set they all implement.
Assembly Language is the native, lowest level way to
program a computer. Each processing chip has its own
Assembly Language. This book teaches programming RISC-V
CPUs either running 32- or 64-bits.
Learning how a computer works, and mastering Assembly
Language, is an excellent way to get into the nitty-gritty
details. These low-cost microcontrollers and SBCs provide
ideal platforms to learn advanced concepts in computing.
Even though all of these devices are low-powered and
compact, they’re still sophisticated computers, many of
which are capable of running the full Linux operating system.
Due to the RISC-V instruction set standard, learning to
program on one RISC-V processor is directly applicable to all
RISC-V processors.
In this book, we cover how to program RISC-V processors
at the lowest level, operating as close to the hardware as
possible. Readers will learn the following:
How to format instructions and combine them into
programs, as well as details of the operative binary data
formats
How to program RISC-V instruction set extensions, such as
floating-point instructions
How to control integrated hardware devices by reading
and writing to the hardware control registers directly
How to interact with the Linux operating system and
microcontroller SDKs
The simplest way to learn these tasks is with a RISC-V
SBC such as the Starfive Visionfive 2. The book also details
how to emulate the RISC-V CPU on an Intel/AMD computer
using the QEMU emulator, as well as how to program the
Espressif ESP32-C3 microcontroller. All the tools needed to
learn Assembly Language programming are open source and
readily available.
This book contains many working programs to play with,
use as a starting point, or study. The only way to learn
programming is by doing it, so do not be afraid to
experiment, as it is the only way to learn.
Even if Assembly Language programming isn’t used in
your day-to-day life, knowing how the processor works at the
Assembly Language level and knowing the low-level binary
data structures will make you a better programmer in all
other areas. Knowing how the processor works will let you
write more efficient C code and can even help with Python
programming.
Enjoy this introduction to Assembly Language. Learning it
for one processor family helps with learning and using any
other processor architectures encountered throughout a
programmer’s career.
Any source code or other supplementary material referenced
by the author in this book is available to readers on GitHub
(https://github.com/Apress). For more detailed information,
please visit https://www.apress.com/gp/services/source-
code.
Acknowledgments
No book is ever written in isolation. I want to especially
thank my wife Cathalynn Labonté-Smith for her support,
encouragement, and expert editing.
I want to thank all the good folks at Apress who made the
whole process easy and enjoyable. A special shout-out to
Nirmal Selvaraj, my production editor, who kept the whole
project moving quickly and smoothly. Thanks to Miriam
Haidara, the acquisitions editor, for mobile tech and maker
programs, who got the project started. Thanks to Stewart
Watkiss, my technical reviewer, who helped make 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, located in
Gibsons, BC, Canada. He’s been
developing software since high
school, or way too many years to
record. He is an expert in Artificial
Intelligence and Assembly
Language programming, earned
his Advanced HAM Radio License,
and enjoys mountain biking, hiking,
and nature photography. He
volunteers for Sunshine Coast
Search and Rescue. He is the
author of Raspberry Pi Assembly
Language Programming: ARM
Processor Coding, Programming
with 64-Bit ARM Assembly
Language: Single Board Computer Development for
Raspberry Pi and Mobile Devices, and RP2040 Assembly
Language Programming: ARM Cortex-M0+ on the
Raspberry Pi Pico, all published by Apress. Also, he writes
his popular technology blog, at smist08.wordpress.com.
About the Technical Reviewer
Stewart Watkiss
is a keen maker who has created
numerous physical computing
projects using a variety of
computers and microcontrollers.
He is author of the Apress titles
Learn Electronics with Raspberry
Pi and Beginning Game
Programming with Pygame Zero.
He studied at the University of
Hull, where he earned a master’s
degree in electronics engineering,
and more recently at Georgia
Institute of Technology, where he earned a master’s degree
in computer science.
Stewart also volunteers as a STEM ambassador, helping
teach programming and physical computing to schoolchildren
and at Raspberry Pi events. He has created numerous
resources for those wanting to learn more about electronics
and computing which are available on his website
(www.penguintutor.com).
© The Author(s), under exclusive license to APress Media, LLC, part of Springer Nature 2024
S. Smith, RISC-V Assembly Language Programming , Maker Innovations Series
https://doi.org/10.1007/979-8-8688-0137-2_1

1. Getting Started
Stephen Smith1
(1) Gibsons, BC, Canada

Most people are familiar with Intel or AMD microprocessors lying at the heart of their
desktop, laptop, or server, and, similarly, most cell phones and tablets use ARM
microprocessors. RISC-V is the new entry built around open-source concepts. Before
getting into the details of RISC-V, let’s first look at the history and evolution of modern
microprocessors.

History and Evolution of the RISC-V CPU


At the heart of every computer, there is at least one Central Processing Unit (CPU) that
executes the programs that you run. Most modern computers have several CPUs, the main
one to run the operating system and user programs, then several helper CPUs to offload
tasks like network communications. Solid-state drives (SSDs) and hard drives (HDDs) each
contain a CPU to read and store the data. Nearly every household appliance from
microwaves to thermostats contains a CPU that interprets button pushes and performs the
appliance’s function. A modern automobile typically contains 1000 to 3000 CPU chips to
control everything from the infotainment system to the power steering to the braking
systems. CPUs range in price from a few cents to thousands of dollars, and each runs its
own special machine code to execute programs.
Early CPUs, such as the IBM 360 mainframe, were large, complicated, and comprised of
thousands of discrete components. In 1971, Intel debuted the Intel 4004, a single chip 4-bit
CPU that allowed the proliferation of handheld calculators. This led to more advanced CPUs
such as the MOS Technology 6502 which had the right combination of being both affordable
yet powerful enough to create both the personal computer and video game industries with
products like the Apple II and Nintendo Entertainment System.
IBM entered the PC market in 1981 using the more complex Intel 8088 CPU. This CPU
was powerful and flexible with 16-bit addressing and variable length machine code
instructions. This started a trend of single-chip CPUs adding complexity with the goal of
becoming mainframes on the desktop. Intel quickly introduced new chips with more and
more advanced functionalities to empower 32-bit and then 64-bit processing, vector
operations, memory protection, multi-tasking, and more. This process added to the chip's
complexity along with the underlying instruction set.
Competitors saw this and thought they could compete with Intel’s Complex Instruction
Set Computers (CISC) by introducing simplified Reduced Instruction Set Computers (RISC).
These computers wouldn’t have the baggage of maintaining compatibility with older chips,
they would start out at 32- or 64-bits. Their instructions would be a fixed width and there
would be fewer of them to allow faster instruction decoding. Each instruction would run in 1
clock cycle. Early RISC processors were typically used in high-end UNIX workstations, so
consequently they never achieved the shipment volume and economies of scale to effectively
compete with Intel.
In 1982, Acorn Computers, which produced the BBC Microcomputer, was looking to
upgrade their line of computers from using the now aging 6502. The engineers at Acorn did
not want to move to the Intel architecture and become another PC clone. Instead, they
wanted the simplicity of the 6502, but modernized. They took the daring step of designing
their own CPU, called the ARM CPU based on the RISC philosophy.
If the ARM was only used in Acorn Computers, it probably would have died out. However,
towards the end of the 1990s, Steve Jobs decided to use the ARM processor in the Apple
iPod. The reason being that because of its simplified instruction set, an ARM processor
didn’t use much power, and this allowed longer battery life in a portable device.
With the success of the iPod, ARM reached a reasonable production volume for more
research and development (R&D), then with the introduction of the iPhone, ARM usage
exploded as ARM processors are used in nearly every phone and tablet in production. Intel
finally had competition from a RISC processor.
Today, most Intel processors implement a RISC core that executes the Intel machine code
using multiple RISC instructions. ARM has become more complex as it supports both 32-
and 64-bit instructions using different formats. A major complaint against both is that to use
compatible machine code with either ARM or Intel processors requires expensive licensing
agreements with the parent companies.
Enter RISC-V, an open standards RISC-based machine, where anyone can produce a
compatible CPU without paying anyone licensing fees. Creating a new CPU machine
language is expensive as you need high-level language compilers and operating support. If
you create a CPU that executes RISC-V instructions, then you can use the standard RISC-V
version of Linux and the standard GNU language toolchain for compiling high-level
languages. The RISC-V project started in 2010 at the University of California, Berkeley, and
RISC-V is the fifth version of the architecture. It supports 32-, 64-, and 128-bit processors.
It is designed to run on everything from microcontrollers costing pennies to superscalar
supercomputers costing millions. We’ve reached a point where many RISC-V CPUs and
computers are appearing. This book will explore the architecture and describe how to
program these RISC-V CPUs at the lowest machine code level.

What You Will Learn


You will learn Assembly Language programming for RISC-V CPUs running in 32- or 64-bit
mode. Everything you will learn is directly applicable to all RISC-V devices from the smallest
microcontrollers to the largest superscalar supercomputers. Learning Assembly Language
for one processor gives you the tools to learn it for another processor, such as ARM
processors typically used in mobile devices.
In all devices, the RISC-V processor isn’t just a CPU, it’s a system on a chip. This means
that most of the computers are all on one chip. When a company is designing a device, they
can select various modular components to include on their chip. Typically, this contains a
RISC-V processor with multiple cores, meaning that it can process instructions for multiple
programs running at once. It likely contains several co-processors for things like floating-
point calculations, a Graphics Processing Unit (GPU), and various communications
protocols.
The RISC-V instruction set is modular. Each RISC-V CPU will implement a set of modules
to provide the functionality its users require. First there is a base module consisting of the
basic integer instructions. There are three common base instruction sets—one for 32-bit,
one for 64-bit, and a slimmed down subset of the 32-bit one for minimal embedded
processors.
The base set provides sufficient functionality to perform integer arithmetic, logic,
comparisons, and branches. Then additional instructions are added in optional modules, for
instance, integer multiplication and division are in the “M” module. Low-cost embedded
processors will only implement a few basic modules, whereas a more powerful CPU
intended to be used in a full Linux-based computer might implement a dozen modules. Table
1-1 contains the three main base versions of the instruction sets that are covered in this
book.
Table 1-1 Base Instruction Sets

Name Description
RV32I Base Integer Instruction Set, 32-bit
RV32E Base Integer Instruction Set (embedded), 32-bit
RV64I Base Integer Instruction Set, 64-bit

Table 1-2 contains the main instruction set extensions. For a complete list, consult the
specifications posted at riscv.org.
Table 1-2 Instruction Set Extensions

Name Description
M Standard Extension for Integer Multiplication and Division
A Standard Extension for Atomic Instructions
F Standard Extension for Single-Precision Floating-Point
D Standard Extension for Double-Precision Floating-Point
Zicsr Control and Status Register (CSR) Instructions
Zifencei Instruction-Fetch Fence
G Shorthand for the IMAFDZicsr_Zifencei base and extensions
C Standard Extension for Compressed Instructions

Working at this low level is technical and time-consuming, so why would a programmer
want to write Assembly Language code?

Ten Reasons to Learn Assembly Language Programming


Most programmers write in a high-level programming language like Python, C#, Java,
JavaScript, Go, Julia, Scratch, Ruby, Swift, or C. These highly productive languages are used
to write major programs from the Linux operating system to websites like Facebook, to
productivity software like LibreOffice. If you learn to be a good programmer in a couple of
these, you can potentially find a well-paying interesting job and write some great programs.
If you create a program in one of these languages, you can easily get it working on
numerous operating systems on multiple hardware architectures. You never have to learn
the details of all the bits and bytes, and these can remain safely under the covers.
When you program in Assembly Language, you are tightly coupled to a given CPU and
moving your program to another requires a complete rewrite of your program. Each
Assembly Language instruction does only a fraction of the amount of work, so to do anything
takes a lot of Assembly statements. Therefore, to do the same work as, say, a Python
program takes an order of magnitude larger amount of effort, for the programmer. Writing
in Assembly Language is harder, as you must solve problems with memory addressing and
CPU registers that are all handled transparently by high-level languages. So why would you
want to learn Assembly Language programming?
Here are 10 reasons to learn and use Assembly Language:
1.
To write more efficient code: Even if you don’t write Assembly Language code,
knowing how the computer works internally allows you to write more streamlined
code. You can make your data structures easier to access and write code in a style
that allows the compiler to generate more effective code. You can make better use of
computer resources, like co-processors, and use the given computer to its fullest
potential.
2. To write your own operating system: The core of the operating system that
initializes the CPU handles hardware security and multi-threading/multi-tasking
requires Assembly code.
3.

To create a new programming language: If it is a compiled language, then you


need to generate the Assembly code to execute. The quality and speed of your
language is largely dependent on the quality and speed of the Assembly Language code
it generates.
4.
To make computers run faster: The best way to make Linux faster is to improve
the GNU C Compiler. If you improve the RISC-V Assembly Language code produced by
GNU C, then every program compiled by GCC benefits.
5.
To interface a computer to a hardware device: When interfacing a computer
through USB or GPIO ports, the speed of data transfer is highly sensitive as to how
fast a program can process the data. Perhaps, there are a lot of bit-level manipulations
that are easier to program in Assembly Language.
6.
To do faster machine learning or 3D graphics programming: Both applications
rely on fast matrix mathematics. If you can make this faster with Assembly and/or
using the co-processors, then you can make AI-based robots or video games that much
better.
7.
To boost performance: Most large programs have components written in different
languages. If a program is 99% C++, the other 1% could be Assembly, perhaps giving
a program a performance boost or some other competitive advantage.
8.
To create a new single-board computer: New boards have some Assembly
Language code to manage peripherals included with the board. This code is usually
called a BIOS (basic input/output system).
9.
To look for security vulnerabilities in a program or piece of hardware: Look at
the Assembly code to do this, otherwise you may not know what is really going on, and
hence where holes might exist.
10.
To look for Easter eggs in programs: These are hidden messages, images, or
inside jokes that programmers hide in their programs. They are usually triggered by
finding a secret keyboard combination to pop them up. Finding them requires reverse
engineering the program and reading Assembly Language.
Now that we have some background on Assembly Language, we’ll look at some choices
for running RISC-V Assembly Language code.

Running Programs on RISC-V Systems


Due to the modular nature of RISC-V, there are a lot of possibilities for running programs.
This book will provide details on the following three specific systems:
1.
RISC-V-based Linux computer such as the Starfive Visionfive 2: This is the
easiest way to play with RISC-V Assembly Language, since everything is done on the
same computer. The CPU on the Visionfive 2 board supports the RV64GC set of RISC-V
extensions.
2.
RISC-V simulator running on an Intel/AMD-based Windows or Linux computer:
Not everyone has a RISC-V computer yet, but don’t let that stop you. You can simulate
RISC-V running full Linux.
3. RISC-V microcontroller: There are many of these such as the Espressif ESP32-C3
DevKit First of all write a program then compile it on another computer such as a
DevKit. First of all, write a program, then compile it on another computer, such as a
Linux laptop, and finally download the compiled program to the microcontroller to run.
This is an important usage of RISC-V Assembly Language, but you will be limited to a
few basic instruction modules, namely, RV32IMC.
There are many other possibilities that also work, but you will need to adapt the
instructions for the supported systems. Next, we look at how to set up each of these to
assemble and run a simple Assembly Language program to print out “Hello RISC-V World!”

Coding a Simple “Hello World” Program


Computers operate on binary data consisting of zeros and ones; however, humans do not
think this way. As a result, humans develop tools to assist us in interacting with computers.
One such tool is the GNU Assembler which takes a human readable version of an Assembly
Language program and converts it to the zeroes and ones that the RISC-V processor
understands. In this section, we will present a simple program without going into detail. The
details will be filled in over the following chapters. In this chapter, we’ll take the program
and look at several ways of Assembling and running it. First, we’ll look at running it on the
Starfive Visionfive 2 SBC under Linux.

Hello World on the Starfive Visionfive 2


The state of Linux on RISC-V computers is evolving quickly. At the time of writing this book,
the Debian Linux install image for the Starfive Visionfive 2 computer is quite minimal and
does not even include a web browser. Please follow the instructions in its Quick Start Guide
for the most up-to-date information. These instructions will also give an idea of what is
required for other RISC-V-based Linux SBCs.
At the time of the writing of this book, these are the instructions to set up the Visionfive
2. The steps are given in more detail in the Visionfive’s Quick Start Guide. The Visionfive
can run Linux from a microSD card, an M.2 SSD drive, or from its internal firmware.
Before you start, you will need the following:
The Starfive Visionfive 2 board, USB keyboard, USB mouse, and HDMI capable monitor
An microSD (Secure Digital) card
A burner program, like Balena Etcher
Secure Shell (SSH) program
Quick Start Guide
Internet connection
First, configure two dip switches on the motherboard to boot from the preferred device.
These instructions follow what is needed to boot from a microSD card, but as long as the
correct instructions are followed, you can run Linux from any supported configuration.
1.
Configure the two dip switches to eMMC.
2.
Download the Debian Linux image for an SD card from Starfive’s website:
https://debian.starfivetech.com/. Next, burn it onto an SD card using a program
like Balena Etcher.
3.
Place the SD card in the Visionfive 2 and turn the Visionfive on.
4.
If you are using a hardwired Internet connection, you can skip this step. When it boots
to Linux, login, the password is “starfive.” Run the Setup program and select your Wifi
and enter the password.
5. Since the base image doesn’t contain a web browser, it is easiest to perform the
following steps using SSH from a host computer on the same Wifi network. This way you
can copy/paste commands from the Quick Start Guide into the SSH program. Use
“ t fi l l” th h t
“starfive.local” as the host name.

ssh [email protected]

6.
Next, the file system needs to be resized. If you don’t do this, you can’t install any
programs, since the base image has little free space. This is a technical step and you
should follow the instructions from the Quick Start Guide carefully as you are deleting
and recreating disk partitions.
7.
Now we perform the long step of installing the extra software that includes web
browsers and the development tools required for this book. Use the scp command to
copy the “install_package_and_dependencies.sh” script to the computer and run it.
Enter the scp command from the host computer:

scp install_package_and_dependencies.sh [email protected]:/home/user

8.
Then the following commands from the SSH remote session.

chmod +x install_package_and_dependencies.sh
./install_package_and_dependencies.sh

Running this takes several hours, so it's a good time to go for lunch. After this script
completes, reboot the Visionfive 2.
9.
Part of the previous shell script installs the GNU development tools. If using a different
Linux distribution of SBC, this may need to be done manually using the command:

sudo apt install build-essential

10.
After the computer reboots, login normally. There are now web browsers, office tools,
and software development tools.
11.
Install a simple GUI text editor to use for programming. Use a terminal-based text
editor like vi if you wish. GEdit is a good simple choice that can be installed with the
following command:

sudo apt install gedit

With the computer setup, we are ready to write, assemble, and run a simple “Hello
World” program. In this chapter, we won’t worry about the details of how this program
works, rather we are ensuring we can assemble, link, and run programs. We will examine
how everything works in detail in the following chapters.
Either download the source code from the Apress Github site or type in the program in
Listing 1-1 and save it as HelloWorld.S, where capitalization is important.

#
# 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"
Listing 1-1 The Linux version of the Hello World program

Anything after a hash sign (#) is a comment. The code lines consist of an optional label,
followed by an opcode, possibly followed by several parameters. To compile and run this
program, create a file called build that contains the contents of Listing 1-2:

as -o HelloWorld.o HelloWorld.S
ld -o HelloWorld HelloWorld.o
Listing 1-2 Build file for Hello World

After saving the build file, convert it to an executable file with the following command:

chmod +x build

Now compile the program by running the build file and then the resulting executable
program with following commands:

./build
./HelloWorld

Figure 1-1 shows the result of running this. bash -x is used to show the commands being
executed.

Figure 1-1 Compiling and running the Hello World program

We’ve now written and executed our first Assembly Language program. Next, let’s look
at running Hello World on a RISC-V emulator.
Random documents with unrelated
content Scribd suggests to you:
WINGY WING FOO.
BY C. A. D. W.
Poor Wingy Wing Foo is a bright little fellow,
With complexion, indeed, most decidedly yellow,
And long almond eyes that take everything in;
But the way he is treated is really a sin.
For naughty Miss Polly will turn up her nose
At his quaint shaven head and his queer little clothes,
And bestow all her love and affectionate care
On rosy-cheeked Mabel, with bright golden hair.

In vain do I argue, in vain do I cry,


"Be kinder, my darling, I beg of you, try."
But Polly shakes harder her wise little head,
And kisses her golden-haired dolly instead.
"Remember he's far from his kindred and home;
'Mid strange little children he's destined to roam,
And how sad is his fate, as no kind little mother
Will take him right in, and make him a brother

"To the fair baby dollies that sit on her knee!


Just think, my own Polly, how hard it must be.
So give him a hug and a motherly kiss,
'Tis one your own babies, I'm sure, never'll miss."
She stooped quickly down, and raised from the floor
The poor little stranger, discarded before,
And said, with a tear in her bright little eye,
"I'm sure I shall love him, mamma, by-and-by."

I received a subscription to Young People for a present, and I like the paper better than any I ever
had before. I like the Post-office Box and the puzzles especially, and the story of Paul Grayson I like
very much.
I am collecting games and amusements, and I would be thankful to any readers of Young People
who send me any nice charades or games. In return I will send some of my own collection, with full
directions for playing each one.

James O'Connor,
287 Ontario Street,
Chicago, Illinois.

Now that the season of long evenings has come again, pretty household games are a necessary
recreation for our young friends. There have been directions in the columns of Young People for some
entertaining winter evening amusements, and more are in preparation. Descriptions of games are
generally too long for the Post-office Box, but if we receive any that are short enough, we will print
them, unless they are of games already well known, or involve the pitching of knives or other
dangerous actions.
There is a great deal of play-time by daylight, too, and it would be interesting if boys in Canada, on the
Atlantic and Pacific coasts, in the West and in the South, would now and then describe their out-of-door
sports during the winter. There will be skating, and coasting, and sleigh-riding for some; orange-picking,
rowing, and picnicking for others. There is one amusement our boys and girls will all enjoy together,
and that is reading Young People; and if in the Post-office Box they learn what are the pastimes of
children in all sections of the country, even those little people who live in solitary places where they
have no playmates, and see nothing all winter but ice-bound rivers and snow-covered plains, will feel
less lonely, and have imaginary companionship during play-time.

Cincinnati, Ohio.

Seeing a letter from Violet S. in the Post-office Box about a society, I thought I would write about a
club we boys have here.
The club, which is called the G. G., is strictly a military organization, consisting of nine members,
each having a gun. We drill every Saturday. Any member who speaks during the drill is confined to
the "guard-house" for five minutes for each offense.
We have also a library of nearly a hundred books, which is a source of great pleasure to us. Every
month we have an election for librarian and secretary.
Whenever an event of importance occurs concerning the club we have a meeting to settle the
matter. We are now preparing a play for the Christmas holidays.

Bert C.

Brantford, Ontario, Canada.

Reba H. wished to know if any correspondent had seen peach-trees blooming in September. I never
saw peach-trees in blossom at that season, but we once had two pear-trees that blossomed in
October.
I take great pleasure in reading Young People. I am eleven years old.

Josie B. G.
Darlington Heights, Virginia.

I was very much interested in the account of sumac gathering in Young People No. 51, and I thought
you would like to know how it is done here in Prince Edward County.
The work of gathering begins in June, and lasts until some time in August. It is gathered here
before it turns red, and the berries are not gathered at all. If the berries are mixed with the leaves
and twigs, it is worthless, and it is worth very little anyway, as the price is only fifty or seventy-five
cents a hundred pounds. There are two kinds of sumac, the male and female; the former is what
the merchants want, but the negroes often try to cheat, for it is very hard to tell the difference
between the two kinds when the sumac is dry. They do not dry it in a house, but lay it on the
ground in the sun for about two days, and then leave it in the shade of the trees for about a week
longer.

Harry J.

Belle Vernon, Pennsylvania.

I live among the hills of Pennsylvania, where they get out great quantities of coal and sand. We
have glass factories in our town, and it is so nice to see them make glass! We have a boat-yard
here, too, and when the boats are launched we can get on them. It is a big slide when the boat
goes into the river.
I am nine years old, and send greeting to Harper's Young People. I tuck it under my pillow every
night.

Mabel M.

Philadelphia, Pennsylvania.

Have any of the readers of Young People ever seen the dove-plant, sometimes called the Espiritu
Santo, or Holy Ghost flower? I saw one in a conservatory here. It is bell-shaped and pure white,
and the petals form a perfect dove.

Paul de M.
You will find a description and a picture of this wonderful flower, which is a native of the Isthmus of
Panama, in Harper's Monthly Magazine for November, 1879, page 863.

Short Hills, New Jersey.

Here is our recipe for johnny-cake, which may be useful to Mary G., or to some other little girl: One
tea-cupful of sweet milk; one tea-cupful of buttermilk; one table-spoonful of melted butter; one
tea-spoonful of salt; one tea-spoonful of soda; enough Indian meal to make it stiff enough to roll
out into a sheet half an inch thick. Spread it on a buttered tin, and bake forty minutes. As soon as it
begins to brown, baste it with melted butter, repeating the operation four or five times, until it is
brown and crisp. Do not cut the sheet, but break it, and eat it for luncheon or tea.
Florence S.

Brooklyn, New York.

Here is my mother's recipe for johnny-cake for Mary G. One cup of white sugar, three eggs, half a
cup of butter. Beat these together until they are light and creamy. Then add one cup of wheat flour,
three cups of Indian meal (yellow is best), three tea-spoonfuls of Royal baking powder, one tea-
spoonful of salt, sweet milk enough to make a cake batter. Beat until very light, and bake in a quick
oven about thirty minutes. We like it best baked in little patty-pans, but you can bake it in a large
sheet just as well.

Ethel W.
Recipes similar to the above have been sent by Louise H. A., Irma C. Terry, Lena Fox, Jane L. Wilson,
Ada Philips, Alexina N., and other little housewives; and all unite in the wish that Mary G. may win the
prize offered by her papa.

Derby, Connecticut.

I would like to tell you how I get Young People. We have a very nice teacher at the school where I
attend, and every week each scholar who is perfect in deportment gets a copy of Young People. All
the scholars like the paper very much, and they all try to be good. I have had a copy every week
since the teacher began to give them, and so have several other scholars.

Ruth M. G.

Otsego Lake, Michigan.

I am eight years old. I live in Northern Michigan, between the two large lakes.
I have a pet fawn. I call it Beauty. It followed me to church last Sunday night; and although it
behaved with perfect decorum, it attracted so much attention that papa had to put it out. I have
every number of Young People.

Louis S. G.

I belong to the Boys' Exploring Association, and last summer we discovered the finest cave in the
Rocky Mountains. It was filled with beautiful stalactites and stalagmites. I have some of the
stalactites in my collection. The only living things we saw in the cave were a bat and two old
mountain rats, one of which had young ones.
A few days ago I visited a coal mine about six miles from Colorado Springs. The coal there is soft,
and lies in a narrow vein. Above and below the coal are veins or strata of sandstone, which is well
covered with impressions of leaves, large and small. As I entered the mine I looked up, and right
over my head there was a perfect impression of a palm-leaf, just like a palm-leaf fan. I tried to take
it out whole, but it would break in pieces. There were also many impressions of small leaves, and I
found pieces of the tree itself. I brought a great many of these impressions home with me. They
must be many thousand years old, like the fossil shells, baculites, and ammonites which I have in
my collection. I would like to exchange some of the leaf impressions with the readers of Young
People. I would like for them Florida beans, sea-shells, or moss, or minerals from California or New
Mexico. I have also some new specimens of different minerals which I would exchange for others.

Herbert E. Peck,
P. O. Box 296, Colorado
Springs, Colorado.
The Boys' Exploring Association alluded to in the above letter is a society largely composed of the
members of a Sunday-school in Colorado Springs. Any boy in the school may become a member on the
payment of a trifling sum, and any other boy whose name is proposed by a member is admitted by
vote. The object of the society is to study the geology and natural history of the surrounding country,
and at certain seasons to make exploring expeditions, under the leadership of the clergyman of the
church. The members pledge themselves to abstain from the use of tobacco and intoxicating drinks, to
use no vulgar or profane language, and to carry no fire-arms while on exploring trips.
During the past summer some important discoveries have been made, and the boys, while deriving
much pleasure from these camping-out excursions, have also gained physically, mentally, and morally.
We would be glad to receive reports of the future actions of this society, which will undoubtedly be of
interest to our young readers, and will perhaps incite other boys to follow the example of these young
naturalists by forming societies to study the botanical, geological, and other natural characteristics of
the region in which they live. All places may not contain so much that is new and wonderful as
Colorado, but everywhere nature has a great deal to teach, if boys and girls will only open their eyes
and hearts to learn.

I have a few patterns of lace, and would be very glad to exchange with Alice C. Little, or any other
correspondent of Young People.

Anna E. Bruce,
Rimersburg, Clarion
County, Pennsylvania.

I am a little boy ten years old. I live in Attleborough, where so much jewelry is made. I take Young
People, and I think it is the best of all the papers for boys and girls.
I would like to exchange postage stamps with any correspondent.

James Arthur Harris,


Attleborough,
Massachusetts.

I live in the Paper City, where they make seventy-five tons of paper in a day. I think some of the
readers of Young People would like to go through the mills with me.
I would like to exchange postage stamps with any one. I am eleven years old.
Willie H. P. Seymour,
P. O. Box 210, Holyoke,
Massachusetts.

I am seven years old. I am a subscriber to Young People, and I love to have my mamma read the
letters from the dear little children in the Post-office Box. I go to school, but have to stay home on
rainy days. I have neither brothers nor sisters. I am a New Mexican boy by birth, and travelled over
three thousand miles with my dear papa and mamma, mostly in stage-coaches, when I was less
than a year old.
I have a large number of Mexican garnets, gathered by Indians upon the plains and in the
mountains and cañons, that I will gladly exchange for choice sea-shells.

Claude D. Millar,
Walnut Hills, near
Cincinnati, Ohio.

I have begun to collect stamps, and I wish to procure as many rare ones as I can. I have two tiny
shells which were picked up on the coast of the Mediterranean Sea by a lady missionary, and sent
to America. I read letters from many shell collectors in the Post-office Box. I will send one of these
shells to any boy or girl who will send me a reasonable number of foreign stamps in return.

Effie K. Price, Bellefontaine,


Ohio.

I would like to exchange rare specimens, coins and stamps, with any readers of Young People. I
would also exchange an arrow made by a great Indian chief near here for something of equal
value.

Robert C. Manly, P. O. Box


66,
Winnipeg, Manitoba,
Canada.

I like Young People very much. I have taken it ever since it was published, and have learned a great
deal from it.
In exchange for sea-shells, sea-weed, or curiosities or relics of any kind, I will send a piece of the
marble of which they are now building the Washington Monument, or a piece of the granite of
which the new State, War, and Navy departments are being built, or both if desired. I would like to
exchange with some one on the Florida and California coast. I am eight years old.

T. Berton Ridenous,
1428 T Street, N. W.,
Washington, D. C.
I will exchange stamps from Egypt, Cape of Good Hope, Western Australia, Tasmania, Cuba,
Barbadoes, Mexico, and other foreign countries, for others from New Brunswick, St. Lucia, Ecuador,
Lagos, and Dominica. I will also exchange birds' eggs.

Willie Ford, Austin, Texas.

Exchanges are also offered by the following correspondents:

Postmarks for specimens of red shale rock.

Sam Risien, Jun.,


Groesbeck, Limestone
County, Texas.

Stamps and postmarks for curiosities, coins, Indian relics, or shells.

A. H. Spear,
167 Madison Street,
Brooklyn, New York.

Shells for other curiosities.

J. Batzer,
Avenue O, between 18th
and 19th Streets,
Galveston, Texas.

Fossil shells for Indian relics.

Sarah H. Wilson,
Clermont, Columbia
County, New York.

Foreign postage stamps with correspondents residing in Nova Scotia, Newfoundland, or Prince
Edward Island.

B. Hoenig,
703 Fifth Street, New York
City.
Postage stamps.

Warren S. Banks,
207 East Eighty-third
Street, New York City.

Soil of Texas for that of any other State.

Jos. L. Paxton,
Taylor, Williamson County,
Texas.

Twenty varieties of postmarks for five varieties of stamps from New Brunswick, Newfoundland,
Nova Scotia, or Prince Edward Island.

A. Graham,
161 Somerset Street,
Newark, New Jersey.

Postage stamps.

C. M. Hemstreet,
108 South Fourteenth
Street, St. Louis, Missouri.

Birds' eggs, foreign postage stamps, and postmarks for eggs.

Harry H. Smith,
833 Logan Street,
Cleveland, Ohio.

Foreign postage stamps for postmarks.

James Leonard,
35 Madison Avenue, New
York City.

Pressed autumn leaves for foreign postage stamps.


Daniel H. Rogers,
Mooretown, Butte County,
California.

Rare stamps of all kinds.

Morris Sternbach,
129 East Sixty-ninth Street,
New York City.

Michigan postmarks and curiosities for postage stamps and minerals.

Teddy Smith,
641 Cass Avenue, Detroit,
Michigan.

Postage stamps.

Bessie C. Smith,
Mapleton, Cass County,
Dakota Territory.

Postage stamps from Japan, Egypt, Hungary, and other countries for stamps from China and South
America.

Clarence Rowe Barton,


1996 Lexington Avenue,
New York City.

Postage stamps for postmarks, stamps, Indian relics, and other curiosities.

H. Beyer,
576 Market Street, Newark,
New Jersey.

Postmarks.

Anne H. Wilson,
Care of Harold Wilson,
Esq., Clermont,
Columbia County, New
York.

Postmarks for minerals or postmarks.

William H. Mason,
392 Sixth Avenue (near
Tenth Street),
Brooklyn, New York.

Postage stamps.

Ben S. Darrow,
545 North Illinois Street,
Indianapolis, Indiana.

Soil of Maryland and Virginia for soil of the Northern and Western States.

D. Fletcher,
Philopolis, Baltimore
County, Maryland.

Five varieties of sharks' teeth for Indian arrowheads.

F. H. Waters,
Philopolis, Baltimore
County, Maryland.

Stamps, postmarks, and birds' eggs.

Howard B. Moses,
Cheltenham Academy,
Shoemakertown,
Pennsylvania.

Postmarks and curiosities.

G. N. Wilson,
Bairdstown, Oglethorpe
County, Georgia.
Stamps, minerals, and eggs of the crow, flicker, spotted tattler, and kingfisher, for eggs of a loon,
eagle, gull, or snipe.

W. A. Webster,
394 Clinton Avenue,
Brooklyn, New York.

Foreign postage stamps, birds' nests, shells, and minerals for birds' eggs, shells, and foreign coins.

Laura Bingham,
Lansing, Michigan.

Chinese curiosities, agates, and postmarks for rare birds' eggs and postage stamps.

C. H. Gurnett,
Ingersoll, Ontario, Canada.

Postage stamps and postmarks for stamps.

Mary H. Kimball,
P. O. Box 493, Stamford,
Connecticut.

Postage stamps.

T. N. Catrevas,
13 West Twentieth Street,
New York City.

Postage stamps and coin.

Sammie P. Cranage, Bay City,


Michigan.

Postage stamps, especially specimens from Japan and Hong-Kong, for others.

F. L. Macondray,
1916 Jackson Street, San
Francisco, California.

Birds' eggs, stamps, and postmarks for the same, or for minerals, coins, or Indian relics.

Ralph J. Wood,
39 (old number) Wildwood
Avenue,
Jackson, Michigan.

Five foreign postage stamps for an ounce of soil from any State, or thirty foreign stamps for an
Indian arrow-head. No duplicate stamp in either exchange.

C. B. Fernald,
1123 Girard Street,
Philadelphia, Pennsylvania.

Foreign postage stamps or United States postmarks for shells or minerals.

George E. Wells,
40 Cottage Place,
Hackensack, New Jersey.

Five rare foreign stamps for a good mineral specimen.

C. C. Shelley, Jun.,
93 South Oxford Street,
Brooklyn, New York.

Sea and fresh water shells and minerals for other minerals and Indian curiosities.

Royal Ferraud,
141 Front Street, West,
Detroit, Michigan.

William Tell Archers, New Orleans.—Bows vary in price from three dollars to ninety and even one
hundred dollars each. It would be well to write to Messrs. Peck & Snyder, Nassau Street, New York city,
importers of English archery goods, for one of their catalogues. E. I. Horsman, of 80 William Street,
New York city, would also send his catalogue on application, and his list comprises all archery goods
manufactured in this country, which are sold at lower prices than the English importations. We never
heard of a whalebone bow on an archery field.

Henry R. C., George E. B., and Others.—Messrs. Harper & Brothers will furnish the cover for Young People,
Vol. I., at the price stated in the advertisement on this page, but in no case can they attend to the
binding.

Louis H.—A stamp collection consists of stamps of different denominations from all countries. The
special locality in the country from which the specimen is sent adds to the interest of a postmark, but
not to that of a stamp. Different issues of the same denomination, when you can obtain them, should
have a place in your stamp album. For example, there have been a good many issues, varying in design
and color, of the United States three-cent stamp. Each one is a valuable specimen; but if you have two
or more exactly alike, paste only one in your album, and reserve the duplicates for exchange.

B. B.—It is not often that we can make room in the Post-office Box for pictures, and we are constantly
compelled to decline pretty and interesting drawings by our young friends. We can much more easily
give space to a short description in writing of any curious phase of wild Indian life that you may notice
than to a pictured representation.

W. E. L.—Your story shows imagination, but is not good enough to print.—Unless you have a natural gift
for ventriloquism you will find it a difficult art to learn. Several books of instruction have been published,
but they are not very satisfactory, and you would learn better by procuring a good teacher than by
endeavoring to follow the directions of a hand-book.

E. A. De L.—A badge expressing the motto of your society is not very easy to invent. A gold shield
bearing the letters F. S. arranged as a monogram, in blue, white, or black enamel would be very simple,
and as appropriate, perhaps, as any more marked design.

Favors are acknowledged from Charles Werner, Ida L. G., Harry C. Earle, Pearl A. H., Isabella T. Niven,
Will S. Norton, Mary K. Bidwell, George K. Diller, Anna Wierum, Mark Manly, Latham T. Souther, Maggie
Behlendorff, Joey W. Dodson, Aaron W. King, Charlie, Hattie Wilcox, Clara Clark, Florence M. Donalds,
Eddie L. S., Sarabelle, E. T. Rice, J. Fitzsimons, Cassie C. Fraleigh, Mary H. Lougee, Coleman E. A., Fred
S. C., Eddie R. T., Edgar E. Helm, Emmer Edwards, Eunice Kate, Clarence D. C.

Correct answers to puzzles are received from Lena Fox, H. M. P., Stella Pratt, Mary L. Fobes, "Unle
Ravaler," C. Gaylor, William A. Lewis, C. H. McB., Cal I. Forny, The Dawley Boys, Mary S. Twing.
PUZZLES FROM YOUNG CONTRIBUTORS.

No. 1.

RHOMBOID—(To Stella).
Across.—A portable dwelling; a kind of food; to inclose; a poem. Down.—A consonant; a printer's
measure; novel; a genus of plants; to hit gently; one of a printer's trials; a consonant.
Mark Marcy.

No. 2.

NUMERICAL CHARADE.
My whole is a Latin quotation, composed of 24 letters, from the fifth book of Virgil's Æneid, which
should be remembered by boys and girls.
My 8, 23, 18, 7, 13 is a city of South America.
My 3, 5, 24, 11, 22 is a city in India.
My 2, 14, 22, 20, 6, 19 is a town of Belgium.
My 1, 16, 24, 9 is a country of South America.
My 21, 16, 17, 10, 4 is one of the British West Indies.
My 15, 12, 11 is a town of Belgium, once a famous resort.
J. D. H.

No. 3.

ENIGMA.
In Harper's Young People my first is hid.
In goat my second, but not in kid.
In letter my third, but the cunningest fox
Will never find it in Post-office Box.
My fourth is in apple, but not in tree.
My fifth in Newton will always be.
My sixth is in month, but never in day.
My seventh in lightning, but not in ray.
My eighth is in runic, but never in Goth.
My ninth is hidden away in moth.
My tenth is in cloth, which that insect destroys.
My eleventh is in racket, but never in boys.
My twelfth is in hearing, but is not in sight.
My thirteenth in shining, but never in bright.
The secrets I hide no man shall know
Though years may come and years may go.

Dame Durden.

ANSWERS TO PUZZLES IN NO. 55.

No. 1.

LOV E R
N A VAL
NI CE R
L E VE R
S I DE S

No. 2.

S E
TE A GA S
SE I NE EA GL E
ANT SLY
E E

No. 3.

A caci A
R ave N
B lu E
U nifor M
T atto O
U niso N
S avag E
Arbutus, Anemone.
HARPER'S YOUNG PEOPLE.
Single Copies, 4 cents; One Subscription, one year, $1.50; Five Subscriptions, one year, $7.00—payable in
advance, postage free.
The Volumes of Harper's Young People commence with the first Number in November of each year.
Subscriptions may begin with any Number. When no time is specified, it will be understood that the
subscriber desires to commence with the Number issued after the receipt of the order.
Remittances should be made by Post-Office Money-Order or Draft, to avoid risk of loss.
Volume I., containing the first 52 Numbers, handsomely bound in illuminated cloth, $3.00, postage
prepaid: Cover, title-page, and index for Volume I., 35 cents; postage, 13 cents additional.
HARPER & BROTHERS,
Franklin Square, N. Y.
SOME ANSWERS TO WIGGLE No. 15, OUR ARTIST'S IDEA, AND NEW
WIGGLE, No. 16.
The following also sent in answers to Wiggle No. 15:
T. A. C., C. S. C., D. H. Freeman, Thomas William Allen, Madgie Ranch, Orin Simons, Norma Hall, L. C.
Sutherland, Harry Lander, I. La Rue, J. R. Glen, Percy F. Jamieson, Cevy Freeman, Isabel Clark,
Christiana Clark, Edna May Morrill, H. M. P., Long Legs, W. Bloomfield, Winthrop, M. E. Farrell, Isabel
Jacob, Emma Shaffer, Charles A. Holbrook, Robert M., L. E. Torrey, Walter Doerr, Theo. F. Muller,
K. E. K., C. Halliday, H. F. S., E. De C., Athalia H. Daly, Kerfoot W. Daly, C. E. S. S., H. R., Ruby R.
Carsard, Alexina Neville, Edward T. Balcom, Edwin Prindle, Dollie Kopp, A. J. Carleton, Fernando
Gonzala, Thomas Flaherty, John Flaherty, Alice Brown, Frank Eaton, Winthrop M. Daniels, W. G. Harpee,
Pierre, Raba Thelin, Felix H. Gray, Freddie L. Temple, Winona D. Anderson, Harry V. Register, Albert L.
Register, S. Croft Register, "Nelse Walton," W. H. C., John N. Howe, Dora K. Noble, Charles A. Tomlinson,
Irving W. Lamb, Burton Harwood, I. R. Herrick, E. W. Little, Samuel von Behren, Harry Cowperthwait,
Jack Nemo, Fanny Crampton, Mamie B. Purdy, Percy B. Purdy, J. P. H., Mary A. Hale, E. D. F., Nella
Coover, F. Uhlenhaut, W. C. Siegert, P. N. Clark, Lillian Thomas, Annie E. Barry, Charlie Conklin, Mary
Burns, Lottie Norton, Hattie Venable, Annie A. Siegert, E. W. Siegert, C. W. Mansur, G. W., "Bo-peep,"
Julius Backofen, Nellie Beers, Oliver Drew, Frank W. Taylor, Willie A. Scott, Reba Hedges, Arthur, Cora,
Mark Manley, E. L. C., Thomas C. Vanderveer, Nellie Hyde, George St. Clair, L. C. H., Mary C. Green,
Frank Miller, Helen S. W., P. B. A., Willie Dobbs, Charlie Dobbs, Agnes D. Cram, Carrie Rauchfuss,
L. O. S., Fred. K. Houston, Howard Starrett, Bertha W. Gill, Willie B. Morris, Millie Olmsted, Nellie Cruger,
F. J. Kaufman, May Longwell, "Masher" (G. H. Gillett), Hattie Wilcox, Everett C. Fay, C. H. T., Bennie
Darrow, Claudius W. Tice, Lam, G. C. Meyer, Hugh Downing, Carrie Davis, M. O. Krum, Howard Rathbon,
D. B. C., Jun., Newton C., J. B. D., Ida Belle, Agnes, Edith Williams, Herman Muhr, Big Brother, Tommy
Roberts, Mamie Hornfager, Hattie Kerr.

FOOTNOTES:
[1] See Kerr's History of Scotland, Vol. II., p. 499.
[2] Jesus Hominum Salvator.
*** END OF THE PROJECT GUTENBERG EBOOK HARPER'S YOUNG
PEOPLE, DECEMBER 7, 1880 ***

Updated editions will replace the previous one—the old editions will
be renamed.

Creating the works from print editions not protected by U.S.


copyright law means that no one owns a United States copyright in
these works, so the Foundation (and you!) can copy and distribute it
in the United States without permission and without paying
copyright royalties. Special rules, set forth in the General Terms of
Use part of this license, apply to copying and distributing Project
Gutenberg™ electronic works to protect the PROJECT GUTENBERG™
concept and trademark. Project Gutenberg is a registered trademark,
and may not be used if you charge for an eBook, except by following
the terms of the trademark license, including paying royalties for use
of the Project Gutenberg trademark. If you do not charge anything
for copies of this eBook, complying with the trademark license is
very easy. You may use this eBook for nearly any purpose such as
creation of derivative works, reports, performances and research.
Project Gutenberg eBooks may be modified and printed and given
away—you may do practically ANYTHING in the United States with
eBooks not protected by U.S. copyright law. Redistribution is subject
to the trademark license, especially commercial redistribution.

START: FULL LICENSE


THE FULL PROJECT GUTENBERG LICENSE
PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK

To protect the Project Gutenberg™ mission of promoting the free


distribution of electronic works, by using or distributing this work (or
any other work associated in any way with the phrase “Project
Gutenberg”), you agree to comply with all the terms of the Full
Project Gutenberg™ License available with this file or online at
www.gutenberg.org/license.

Section 1. General Terms of Use and


Redistributing Project Gutenberg™
electronic works
1.A. By reading or using any part of this Project Gutenberg™
electronic work, you indicate that you have read, understand, agree
to and accept all the terms of this license and intellectual property
(trademark/copyright) agreement. If you do not agree to abide by all
the terms of this agreement, you must cease using and return or
destroy all copies of Project Gutenberg™ electronic works in your
possession. If you paid a fee for obtaining a copy of or access to a
Project Gutenberg™ electronic work and you do not agree to be
bound by the terms of this agreement, you may obtain a refund
from the person or entity to whom you paid the fee as set forth in
paragraph 1.E.8.

1.B. “Project Gutenberg” is a registered trademark. It may only be


used on or associated in any way with an electronic work by people
who agree to be bound by the terms of this agreement. There are a
few things that you can do with most Project Gutenberg™ electronic
works even without complying with the full terms of this agreement.
See paragraph 1.C below. There are a lot of things you can do with
Project Gutenberg™ electronic works if you follow the terms of this
agreement and help preserve free future access to Project
Gutenberg™ electronic works. See paragraph 1.E below.
1.C. The Project Gutenberg Literary Archive Foundation (“the
Foundation” or PGLAF), owns a compilation copyright in the
collection of Project Gutenberg™ electronic works. Nearly all the
individual works in the collection are in the public domain in the
United States. If an individual work is unprotected by copyright law
in the United States and you are located in the United States, we do
not claim a right to prevent you from copying, distributing,
performing, displaying or creating derivative works based on the
work as long as all references to Project Gutenberg are removed. Of
course, we hope that you will support the Project Gutenberg™
mission of promoting free access to electronic works by freely
sharing Project Gutenberg™ works in compliance with the terms of
this agreement for keeping the Project Gutenberg™ name associated
with the work. You can easily comply with the terms of this
agreement by keeping this work in the same format with its attached
full Project Gutenberg™ License when you share it without charge
with others.

1.D. The copyright laws of the place where you are located also
govern what you can do with this work. Copyright laws in most
countries are in a constant state of change. If you are outside the
United States, check the laws of your country in addition to the
terms of this agreement before downloading, copying, displaying,
performing, distributing or creating derivative works based on this
work or any other Project Gutenberg™ work. The Foundation makes
no representations concerning the copyright status of any work in
any country other than the United States.

1.E. Unless you have removed all references to Project Gutenberg:

1.E.1. The following sentence, with active links to, or other


immediate access to, the full Project Gutenberg™ License must
appear prominently whenever any copy of a Project Gutenberg™
work (any work on which the phrase “Project Gutenberg” appears,
or with which the phrase “Project Gutenberg” is associated) is
accessed, displayed, performed, viewed, copied or distributed:
This eBook is for the use of anyone anywhere in the United
States and most other parts of the world at no cost and with
almost no restrictions whatsoever. You may copy it, give it away
or re-use it under the terms of the Project Gutenberg License
included with this eBook or online at www.gutenberg.org. If you
are not located in the United States, you will have to check the
laws of the country where you are located before using this
eBook.

1.E.2. If an individual Project Gutenberg™ electronic work is derived


from texts not protected by U.S. copyright law (does not contain a
notice indicating that it is posted with permission of the copyright
holder), the work can be copied and distributed to anyone in the
United States without paying any fees or charges. If you are
redistributing or providing access to a work with the phrase “Project
Gutenberg” associated with or appearing on the work, you must
comply either with the requirements of paragraphs 1.E.1 through
1.E.7 or obtain permission for the use of the work and the Project
Gutenberg™ trademark as set forth in paragraphs 1.E.8 or 1.E.9.

1.E.3. If an individual Project Gutenberg™ electronic work is posted


with the permission of the copyright holder, your use and distribution
must comply with both paragraphs 1.E.1 through 1.E.7 and any
additional terms imposed by the copyright holder. Additional terms
will be linked to the Project Gutenberg™ License for all works posted
with the permission of the copyright holder found at the beginning
of this work.

1.E.4. Do not unlink or detach or remove the full Project


Gutenberg™ License terms from this work, or any files containing a
part of this work or any other work associated with Project
Gutenberg™.

1.E.5. Do not copy, display, perform, distribute or redistribute this


electronic work, or any part of this electronic work, without
prominently displaying the sentence set forth in paragraph 1.E.1
with active links or immediate access to the full terms of the Project
Gutenberg™ License.

1.E.6. You may convert to and distribute this work in any binary,
compressed, marked up, nonproprietary or proprietary form,
including any word processing or hypertext form. However, if you
provide access to or distribute copies of a Project Gutenberg™ work
in a format other than “Plain Vanilla ASCII” or other format used in
the official version posted on the official Project Gutenberg™ website
(www.gutenberg.org), you must, at no additional cost, fee or
expense to the user, provide a copy, a means of exporting a copy, or
a means of obtaining a copy upon request, of the work in its original
“Plain Vanilla ASCII” or other form. Any alternate format must
include the full Project Gutenberg™ License as specified in
paragraph 1.E.1.

1.E.7. Do not charge a fee for access to, viewing, displaying,


performing, copying or distributing any Project Gutenberg™ works
unless you comply with paragraph 1.E.8 or 1.E.9.

1.E.8. You may charge a reasonable fee for copies of or providing


access to or distributing Project Gutenberg™ electronic works
provided that:

• You pay a royalty fee of 20% of the gross profits you derive
from the use of Project Gutenberg™ works calculated using the
method you already use to calculate your applicable taxes. The
fee is owed to the owner of the Project Gutenberg™ trademark,
but he has agreed to donate royalties under this paragraph to
the Project Gutenberg Literary Archive Foundation. Royalty
payments must be paid within 60 days following each date on
which you prepare (or are legally required to prepare) your
periodic tax returns. Royalty payments should be clearly marked
as such and sent to the Project Gutenberg Literary Archive
Foundation at the address specified in Section 4, “Information
about donations to the Project Gutenberg Literary Archive
Foundation.”

• You provide a full refund of any money paid by a user who


notifies you in writing (or by e-mail) within 30 days of receipt
that s/he does not agree to the terms of the full Project
Gutenberg™ License. You must require such a user to return or
destroy all copies of the works possessed in a physical medium
and discontinue all use of and all access to other copies of
Project Gutenberg™ works.

• You provide, in accordance with paragraph 1.F.3, a full refund of


any money paid for a work or a replacement copy, if a defect in
the electronic work is discovered and reported to you within 90
days of receipt of the work.

• You comply with all other terms of this agreement for free
distribution of Project Gutenberg™ works.

1.E.9. If you wish to charge a fee or distribute a Project Gutenberg™


electronic work or group of works on different terms than are set
forth in this agreement, you must obtain permission in writing from
the Project Gutenberg Literary Archive Foundation, the manager of
the Project Gutenberg™ trademark. Contact the Foundation as set
forth in Section 3 below.

1.F.

1.F.1. Project Gutenberg volunteers and employees expend


considerable effort to identify, do copyright research on, transcribe
and proofread works not protected by U.S. copyright law in creating
the Project Gutenberg™ collection. Despite these efforts, Project
Gutenberg™ electronic works, and the medium on which they may
be stored, may contain “Defects,” such as, but not limited to,
incomplete, inaccurate or corrupt data, transcription errors, a
copyright or other intellectual property infringement, a defective or
damaged disk or other medium, a computer virus, or computer
codes that damage or cannot be read by your equipment.

1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for


the “Right of Replacement or Refund” described in paragraph 1.F.3,
the Project Gutenberg Literary Archive Foundation, the owner of the
Project Gutenberg™ trademark, and any other party distributing a
Project Gutenberg™ electronic work under this agreement, disclaim
all liability to you for damages, costs and expenses, including legal
fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR
NEGLIGENCE, STRICT LIABILITY, BREACH OF WARRANTY OR
BREACH OF CONTRACT EXCEPT THOSE PROVIDED IN PARAGRAPH
1.F.3. YOU AGREE THAT THE FOUNDATION, THE TRADEMARK
OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL
NOT BE LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT,
CONSEQUENTIAL, PUNITIVE OR INCIDENTAL DAMAGES EVEN IF
YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH DAMAGE.

1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you


discover a defect in this electronic work within 90 days of receiving
it, you can receive a refund of the money (if any) you paid for it by
sending a written explanation to the person you received the work
from. If you received the work on a physical medium, you must
return the medium with your written explanation. The person or
entity that provided you with the defective work may elect to provide
a replacement copy in lieu of a refund. If you received the work
electronically, the person or entity providing it to you may choose to
give you a second opportunity to receive the work electronically in
lieu of a refund. If the second copy is also defective, you may
demand a refund in writing without further opportunities to fix the
problem.

1.F.4. Except for the limited right of replacement or refund set forth
in paragraph 1.F.3, this work is provided to you ‘AS-IS’, WITH NO
OTHER WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR ANY PURPOSE.

1.F.5. Some states do not allow disclaimers of certain implied


warranties or the exclusion or limitation of certain types of damages.
If any disclaimer or limitation set forth in this agreement violates the
law of the state applicable to this agreement, the agreement shall be
interpreted to make the maximum disclaimer or limitation permitted
by the applicable state law. The invalidity or unenforceability of any
provision of this agreement shall not void the remaining provisions.

1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation,


the trademark owner, any agent or employee of the Foundation,
anyone providing copies of Project Gutenberg™ electronic works in
accordance with this agreement, and any volunteers associated with
the production, promotion and distribution of Project Gutenberg™
electronic works, harmless from all liability, costs and expenses,
including legal fees, that arise directly or indirectly from any of the
following which you do or cause to occur: (a) distribution of this or
any Project Gutenberg™ work, (b) alteration, modification, or
additions or deletions to any Project Gutenberg™ work, and (c) any
Defect you cause.

Section 2. Information about the Mission


of Project Gutenberg™
Project Gutenberg™ is synonymous with the free distribution of
electronic works in formats readable by the widest variety of
computers including obsolete, old, middle-aged and new computers.
It exists because of the efforts of hundreds of volunteers and
donations from people in all walks of life.

Volunteers and financial support to provide volunteers with the


assistance they need are critical to reaching Project Gutenberg™’s
goals and ensuring that the Project Gutenberg™ collection will
remain freely available for generations to come. In 2001, the Project
Gutenberg Literary Archive Foundation was created to provide a
secure and permanent future for Project Gutenberg™ and future
generations. To learn more about the Project Gutenberg Literary
Archive Foundation and how your efforts and donations can help,
see Sections 3 and 4 and the Foundation information page at
www.gutenberg.org.

Section 3. Information about the Project


Gutenberg Literary Archive Foundation
The Project Gutenberg Literary Archive Foundation is a non-profit
501(c)(3) educational corporation organized under the laws of the
state of Mississippi and granted tax exempt status by the Internal
Revenue Service. The Foundation’s EIN or federal tax identification
number is 64-6221541. Contributions to the Project Gutenberg
Literary Archive Foundation are tax deductible to the full extent
permitted by U.S. federal laws and your state’s laws.

The Foundation’s business office is located at 809 North 1500 West,


Salt Lake City, UT 84116, (801) 596-1887. Email contact links and up
to date contact information can be found at the Foundation’s website
and official page at www.gutenberg.org/contact

Section 4. Information about Donations to


the Project Gutenberg Literary Archive
Foundation
Project Gutenberg™ depends upon and cannot survive without
widespread public support and donations to carry out its mission of
increasing the number of public domain and licensed works that can
be freely distributed in machine-readable form accessible by the
widest array of equipment including outdated equipment. Many
small donations ($1 to $5,000) are particularly important to
maintaining tax exempt status with the IRS.

The Foundation is committed to complying with the laws regulating


charities and charitable donations in all 50 states of the United
States. Compliance requirements are not uniform and it takes a
considerable effort, much paperwork and many fees to meet and
keep up with these requirements. We do not solicit donations in
locations where we have not received written confirmation of
compliance. To SEND DONATIONS or determine the status of
compliance for any particular state visit www.gutenberg.org/donate.

While we cannot and do not solicit contributions from states where


we have not met the solicitation requirements, we know of no
prohibition against accepting unsolicited donations from donors in
such states who approach us with offers to donate.

International donations are gratefully accepted, but we cannot make


any statements concerning tax treatment of donations received from
outside the United States. U.S. laws alone swamp our small staff.

Please check the Project Gutenberg web pages for current donation
methods and addresses. Donations are accepted in a number of
other ways including checks, online payments and credit card
donations. To donate, please visit: www.gutenberg.org/donate.

Section 5. General Information About


Project Gutenberg™ electronic works
Professor Michael S. Hart was the originator of the Project
Gutenberg™ concept of a library of electronic works that could be
freely shared with anyone. For forty years, he produced and
distributed Project Gutenberg™ eBooks with only a loose network of
volunteer support.
Project Gutenberg™ eBooks are often created from several printed
editions, all of which are confirmed as not protected by copyright in
the U.S. unless a copyright notice is included. Thus, we do not
necessarily keep eBooks in compliance with any particular paper
edition.

Most people start at our website which has the main PG search
facility: www.gutenberg.org.

This website includes information about Project Gutenberg™,


including how to make donations to the Project Gutenberg Literary
Archive Foundation, how to help produce our new eBooks, and how
to subscribe to our email newsletter to hear about new eBooks.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

textbookfull.com

You might also like