CSC231 Homework 2 2014
--D. Thiebaut (talk) 09:48, 21 September 2014 (EDT)
This homework is due on Tuesday, Sept. 30th, at 11:55 p.m.
Contents
Preparation
- Create a program called IOskel.asm using your 231a-xx account, on a Linux machine (beowulf2, grendel, or any of the Linux Mint PCs in FH342 or FH345, and copy this code in it:
;;; ----------------------------------------------------- ;;; IOskel.asm ;;; D. Thiebaut ;;; Simple skeleton program illustrating how to get an ;;; integer from the command line and displaying it back ;;; ;;; To assemble, link and run: ;;; nasm -f elf 231Lib.asm ;;; nasm -f elf IOskel.asm ;;; ld -melf_i386 IOskel.o 231Lib.o ;;; ./IOskel ;;; ----------------------------------------------------- ;;; extern functions that will be linked to this program ;;; contained in 231Lib.asm extern _printDec extern _printString extern _println extern _getInput ;;; ----------------------------------------------------- ;;; data section ;;; ----------------------------------------------------- section .data x dd 0 ; the integer used for IO msgX db "x = " prompt db "> " ;;; ----------------------------------------------------- ;;; code section ;;; ----------------------------------------------------- section .text global _start _start: ;;; get number from user mov ecx, prompt mov edx, 2 call _printString call _getInput mov dword[x], eax ;;; print "x = dddd" where dddd is the contents of x ;;; in decimal mov ecx, msgX mov edx, 4 call _printString mov eax, dword[x] call _printDec call _println ;;; ; exit mov ebx, 0 mov eax, 1 int 0x80
- Also create another program called 231Lib.asm, and copy the code found on this page in it.
- 231Lib.asm is a library of functions that will be useful for this assignment. You do not, and should not have to modify the code in this program.
- IOskel.asm is a skeleton which you will have to copy into new assembly programs, which you will edit to solve various problems.
- Assemble, link, and run the programs as follows (user input in boldface):
nasm -f elf IOskel.asm nasm -f elf 231Lib.asm (once you have assembled it, you don't need to repeat this step) ld -melf_i386 -o IOskel IOskel.o 231Lib.o ./IOskel >
- The ">" symbol is a prompt: the program is asking you to input a number. Just input an integer, and press Enter:
> 22334 x = 22334
Problem #1
- Copy IOskel.asm into a new program, called hw2_1.asm
cp IOskel.asm hw2_1.asm
- Add new code between the 'call _println and the ;;; exit lines. This code should compute and display the following arithmetic operation:
z = x * 4 - 1;
Imporant Note: do not use multiply and divide yet. They are complex instructions to master, and beyond our scope at this point. We'll see them later. So, when you have to multiply quatities, figure out how to use add or sub instead, and generate the same result.
- Here are two examples of the output expected:
./hw2_1 > 344 x = 344 z = 1375 ./hw2_1 > 100 x = 100 z = 399
Moodle Submission
- Locate the area for Homework 2, Problem 1, and submit your program there.
Problem #2
- This is similar to what you had to do for Problem 1: Create a new program called Hw2_2.asm which gets 2 integers (which your program will call x, and y) from the user and computes this equation:
z = 2 * x - 3 * y + 7
- Example of output:
./hw2_2 > 10 > 1 x = 10 y = 1 z = 24 ./hw2_2 > 20 > 2 x = 20 y = 2 z = 41
Note: the function _printDec does not know how to print negative numbers. We'll see why later. So if your output looks like a large positive number while it should be negative, that's normal!
Moodle Submission
- Submit your program to the Homework 2, Problem 2 section on Moodle.
Problem #3
- This time the program is called Hw2_3.asm, gets 2 integers x and y from the user, and computes the equation:
z = ( x + y )* 3 + ( x - y ) * 4
- Typical output:
./hw2_3 > 3 > 1 x = 3 y = 1 z = 4 ./hw2_3 > 4 > 2 x = 4 y = 2 z = 10
Moodle Submission
- Submit your program to the Homework 2, Problem 3 section on Moodle.
The next problems are repeats of the irst 3 problems, but the variables change size.
problem #4
- Same as problem #1, but this time, x and z are 16-bit words. They are declared as follows:
x dw 0 z dw 0
- You cannot modify 231Lib.asm. You have to use the original _getInput and _printDec functions.
- You may use additional variables, but this solution will not be worth as many points as having only 2 variables in your program.
Moodle Submission
- Locate the Problem 4 section of Homework 2, and submit your program there.
problem #5
same problem as Problem #2, but this time,x, y, and z are 16-bit words
problem 6
Same as problem #3, but this time x, y, and z are 16- bit words.
Problem 7
Same as problem 3, but this time x, y, and z are bytes.