CO Lab Manual
Course Page
  • Course Information
    • Welcome
    • Introduction
    • Your Contributions
    • Lab Sessions and Etiquette
    • Team Setup
    • Assumed Prior Knowledge
  • Setup Guides
    • GitHub Repository Setup
    • Technical Setup
      • Windows
      • Linux
      • macOS
    • GitHub SSH Setup
    • Framework Setup
  • Reference Documentation
    • Introduction to the Documentation
    • A Brief History Lesson
    • Syntax (Intel vs. AT&T)
      • Section Exercises
    • Memory
      • Memory Management
      • Section Exercises
    • Registers
      • Section Exercises
    • Instructions
    • Subroutines
      • Calling Subroutines
      • Writing Subroutines
      • Section Exercises
    • Input/Output
      • Printing to the Terminal
      • Reading from the Terminal
      • Section Exercises
    • Programming Constructs
    • Assembler Directives
    • C/C++ vs Assembly
    • Building and Running Programs
    • Address Sanitization
    • A0: A Running Example
  • Assignments
    • Introduction to the Assignments
    • Mandatory Assignments
      • A1: Subroutines and I/O
      • A2: Recursion
    • Extra Assignments
      • A3-a: Fibonacci Calculator
      • A3-b: Fibonacci REPL
      • A4: Diff
      • A5: Printf
      • A6: HPC
      • A7: Bitmap
      • A8: Game
  • Appendix
    • Acknowledgments
    • Rules and Regulations
    • Frequently Asked Questions
    • How to use a Debugger
Powered by GitBook
On this page
  • True or False
  • Multiple Choice
  1. Reference Documentation
  2. Input/Output

Section Exercises

PreviousReading from the TerminalNextProgramming Constructs

Last updated 4 months ago

True or False

printf takes only one argument which represents the memory address of the first byte of a string.

False!

printf takes a variable number of arguments depending on how many format specifiers are in your string (if you want to deepen you knowledge regarding the printf functionality try ). More important, the first argument is always the format string.

scanf takes a variable number of arguments, the first one being a format string.

True!

Note: Because of this, for scanf, the number of vector registers specified in the al registers will be 0.

Stack pointer relative addressing is useful when the values read with scanf are needed throughout the program/subroutines.

False!

The base pointer relative addressing is useful in this case. Stack pointer relative addressing is useful for values used once or for a short period of time.

Base pointer relative addressing should be used for values that are used for a short time.

False!

Base pointer relative addressing is useful when the value of a variable is needed throughout a program/subroutine.

Stack pointer relative addressing should be used for values that are only accessed once.

True!

Stack pointer relative addressing is useful when the value should only be stored on the stack until it can be moved to registers for further usage, so for values that are only used once or for a short time.

The following assembly code shows a correct usage of scanf:

.text
.input: .asciz "%d"

main:
    # prolog
    subq $8, %rsp
    # ...
    leaq input(%rip), %rsi
    leaq -8(%rbp), %rdi
    movb $0, %al
    call scanf

False!

The first argument of scanf, stored in rdi, is the address of the string/format that it will read and the second argument, stored in rsi, is the location on the stack where the read value will be stored. Moreover, regarding calling conventions, the stack is misaligned as we only subtract 8 from rsp instead of 16 or a multiple of 16.

In the previous question, we should have used movq $0, %al instead of movb $0, %al.

False!

In the register section, we saw that the name of the register can indicate its size and location. In this case, al stores 8 bits (1 byte), so we need to use movb to indicate that we move one byte.

Multiple Choice

Which directive tells the assembler that a string should be placed in a text section as ASCII-encoded characters?

.asciz

Correct!

The .asciz directive indicates that a string should be placed in a text section as ASCII-encoded characters, but it also indicates the fact that the string will be followed by a zero byte.

.ascii

Correct!

.text

Wrong!

The .text directive specifies that the following line should be placed in the text section of the program, but does not indicate the type or encoding of the content of the line.

.equ

Wrong!

The .equ directive can be used to define symbolic names for expressions, such as numeric constants.

Which format specifiers indicate a signed long, a zero-terminated string and hexadecimal integer?

d, s, x

Wrong!

d indicates a signed integer.

ld, s, lx

Wrong!

lx indicates a hexadecimal long.

ld, s, x

Correct!

d, s, lx

Wrong!

d indicates a signed integer, while %lx indicates a hexadecimal long.

A5: Printf