Difference between revisions of "CSC231 Homework 5 Fall 2017"
(→Preparation) |
|||
(21 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
--[[User:Thiebaut|D. Thiebaut]] ([[User talk:Thiebaut|talk]]) 09:27, 30 October 2017 (EDT) | --[[User:Thiebaut|D. Thiebaut]] ([[User talk:Thiebaut|talk]]) 09:27, 30 October 2017 (EDT) | ||
---- | ---- | ||
+ | <br /> | ||
+ | <bluebox> | ||
+ | This assignment is due Monday 11/6/2017 at 11:55 p.m. <br /> | ||
+ | Note: you will not be given the ability to evaluate your program on Moodle, and see its final grade. For this reason, make sure you thoroughly test your programs before submitting them! | ||
+ | </bluebox> | ||
+ | <br /> | ||
+ | __TOC__ | ||
+ | <br /> | ||
=Preparation= | =Preparation= | ||
<br /> | <br /> | ||
Line 78: | Line 86: | ||
# when _getString returns to your main program, it will set ecx to the address of the array containing the string, and it will set edx to contain the number of characters the user typed at the keyboard. | # when _getString returns to your main program, it will set ecx to the address of the array containing the string, and it will set edx to contain the number of characters the user typed at the keyboard. | ||
# the user indicates the end of the string by pressing the ENTER key. The string does not contain the ENTER character (line-feed). | # the user indicates the end of the string by pressing the ENTER key. The string does not contain the ENTER character (line-feed). | ||
+ | # although I didn't do that here because the program is so simple and short, it is a good idea, just after returning from a call to _getString, to save ecx and edx into two different variables in memory that will hold the address of the string and the number of chars entered at the keyboard. | ||
+ | <br /> | ||
+ | |||
+ | =Problem 1= | ||
+ | <br /> | ||
+ | Write a program called '''hw5a.asm''' that prompts the user for a string, and prints it back several times. The number of times the string is printed is the same as the number of characters in the string. | ||
+ | <br /> | ||
+ | ;Examples: | ||
+ | |||
+ | cs231a@aurora ~ $ ./hw5a | ||
+ | > B | ||
+ | B | ||
+ | |||
+ | cs231a@aurora ~ $ ./hw5a | ||
+ | > a | ||
+ | a | ||
+ | |||
+ | cs231a@aurora ~ $ ./hw5a | ||
+ | > hello | ||
+ | hello | ||
+ | hello | ||
+ | hello | ||
+ | hello | ||
+ | hello | ||
+ | |||
+ | cs231a@aurora $ ./hw5a | ||
+ | > chocolate | ||
+ | chocolate | ||
+ | chocolate | ||
+ | chocolate | ||
+ | chocolate | ||
+ | chocolate | ||
+ | chocolate | ||
+ | chocolate | ||
+ | chocolate | ||
+ | chocolate | ||
+ | |||
+ | cs231a@aurora $ ./hw5a | ||
+ | > Hall o ween | ||
+ | Hall o ween | ||
+ | Hall o ween | ||
+ | Hall o ween | ||
+ | Hall o ween | ||
+ | Hall o ween | ||
+ | Hall o ween | ||
+ | Hall o ween | ||
+ | Hall o ween | ||
+ | Hall o ween | ||
+ | Hall o ween | ||
+ | Hall o ween | ||
+ | |||
+ | <br /> | ||
+ | ==Note== | ||
+ | <br /> | ||
+ | * Your program does not have to handle 0-length strings. In other words, your program will not be tested with empty strings. | ||
+ | <br /> | ||
+ | ==Submission== | ||
+ | <br /> | ||
+ | * Submit your program in the '''Homework 5, Problem 1''' section on Moodle. | ||
+ | <br /> | ||
+ | |||
+ | =Problem 2= | ||
+ | <br /> | ||
+ | Modify your solution program for Problem 1 so that it removes the last character of the previous printed string as it goes through the loop: | ||
+ | <br /> | ||
+ | ;Examples | ||
+ | cs231a@aurora $ ./hw5b | ||
+ | > Hall-o-ween | ||
+ | Hall-o-ween | ||
+ | Hall-o-wee | ||
+ | Hall-o-we | ||
+ | Hall-o-w | ||
+ | Hall-o- | ||
+ | Hall-o | ||
+ | Hall- | ||
+ | Hall | ||
+ | Hal | ||
+ | Ha | ||
+ | H | ||
+ | |||
+ | cs231a@aurora $ ./hw5b | ||
+ | > a | ||
+ | a | ||
+ | |||
+ | cs231a@aurora ~/HWs/HW5/PB2 $ ./hw5b | ||
+ | > 123456789 | ||
+ | 123456789 | ||
+ | 12345678 | ||
+ | 1234567 | ||
+ | 123456 | ||
+ | 12345 | ||
+ | 1234 | ||
+ | 123 | ||
+ | 12 | ||
+ | 1 | ||
+ | |||
+ | <br /> | ||
+ | ==Submission== | ||
+ | <br /> | ||
+ | * Submit your program in the '''Homework 5, Problem 2''' section on Moodle. | ||
+ | <br /> | ||
+ | |||
+ | =Problem 3= | ||
+ | <br /> | ||
+ | Same as with Problem 2, but this time the triangle is reversed: | ||
+ | <br /> | ||
+ | ;Example | ||
+ | |||
+ | cs231a@aurora $ ./hw5c | ||
+ | > Hal-lo-we-en | ||
+ | H | ||
+ | Ha | ||
+ | Hal | ||
+ | Hal- | ||
+ | Hal-l | ||
+ | Hal-lo | ||
+ | Hal-lo- | ||
+ | Hal-lo-w | ||
+ | Hal-lo-we | ||
+ | Hal-lo-we- | ||
+ | Hal-lo-we-e | ||
+ | Hal-lo-we-en | ||
+ | |||
+ | <br /> | ||
+ | ==Submission== | ||
+ | <br /> | ||
+ | * Submit your program to the '''Homework 5, Problem 3''' section on Moodle. | ||
+ | <br /> | ||
+ | |||
+ | =Problem 4= | ||
+ | <br /> | ||
+ | * Write a program called '''hw4d.asm''' that prompts the user for a string, and displays the ''checksum'' of this string, in decimal. | ||
+ | <br /> | ||
+ | * The checksum of a string is the ''exclusive or'' of all the bytes in a string. This is an operation used mostly in communication, when bytes of data are sent over a network. In general, when a packet of bytes is sent, the exclusive or of all the bytes is computed, and sent at the end, as an extra byte. The receiving device, upon receiving the data, will compute the exclusive or of all the data bytes, and compare the checksum it computed to the checksum that was sent. If the two checksums are different, very likely a transmission error occurred and the receiving device will ask for the packet to be transmitted again. | ||
+ | <br /> | ||
+ | * Here is how you would compute the checksum of a string of 5 bytes: 0x41, 0x42, 0x43, 0x44, 0x45. I will use binary, as it is simpler: | ||
+ | |||
+ | checksum <-- 0x41 = 0100 0001 | ||
+ | checksum <-- checksum xor 0x42 = 0100 0001 xor 0100 0010 = 0000 0011 | ||
+ | checksum <-- checksum xor 0x43 = 0000 0011 xor 0100 0011 = 0100 0000 | ||
+ | checksum <-- checksum xor 0x44 = 0100 0000 xor 0100 0100 = 0000 0100 | ||
+ | checksum <-- checksum xor 0x45 = 0000 0100 xor 0100 0101 = 0100 0001 | ||
+ | |||
+ | :The checksum of the 5 bytes is 0100 0001, or 0x41, or 65. The program will print 65 as the checksum for the string ABCDE. | ||
+ | |||
+ | * Examples | ||
+ | |||
+ | cs231a@aurora ~ $ ./hw5d | ||
+ | > hello there | ||
+ | 44 | ||
+ | |||
+ | cs231a@aurora ~ $ ./hw5d | ||
+ | > ABCDE | ||
+ | 65 | ||
+ | |||
+ | cs231a@aurora ~ $ ./hw5d | ||
+ | > AA | ||
+ | 0 | ||
+ | |||
+ | cs231a@aurora ~ $ ./hw5d | ||
+ | > Hello! | ||
+ | 99 | ||
+ | |||
+ | cs231a@aurora ~ $ ./hw5d | ||
+ | > I like milk chocolate better than dark chocolate. | ||
+ | 80 | ||
+ | |||
+ | <br /> | ||
+ | ==Submission== | ||
+ | <br /> | ||
+ | Submit your program on Moodle, in the Homework 5, Problem 4 section. | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <showafterdate after="20171107 00:00" before="20171231"> | ||
+ | =Solutions= | ||
+ | <br /> | ||
+ | ==Problem 1== | ||
+ | <br /> | ||
+ | ::<source lang="asm"> | ||
+ | ;;; ; hw5a.asm | ||
+ | ;;; ; D. Thiebaut | ||
+ | ;;; ; | ||
+ | ;;; ; | ||
+ | ;;; ; ------------------------------------------------------------------- | ||
+ | |||
+ | ;;; ------------------------------------------------------------ | ||
+ | ;;; data areas | ||
+ | ;;; ------------------------------------------------------------ | ||
+ | |||
+ | section .data | ||
+ | prompt db "> " | ||
+ | bufferAddr dd 0 | ||
+ | noChars dd 0 | ||
+ | saveEcx dd 0 | ||
+ | |||
+ | ;;; ------------------------------------------------------------ | ||
+ | ;;; code area | ||
+ | ;;; ------------------------------------------------------------ | ||
+ | |||
+ | section .text | ||
+ | global _start | ||
+ | extern _getString | ||
+ | extern _printString | ||
+ | extern _println | ||
+ | |||
+ | _start: | ||
+ | mov ecx, prompt | ||
+ | mov edx, 2 | ||
+ | call _printString | ||
+ | |||
+ | call _getString | ||
+ | mov dword[noChars], edx | ||
+ | mov dword[bufferAddr], ecx | ||
+ | |||
+ | ;;; print string in a loop that goes the same # of times | ||
+ | ;;; as the number of chars in the string. | ||
+ | |||
+ | mov ecx, dword[noChars] | ||
+ | for: mov dword[saveEcx], ecx | ||
+ | |||
+ | mov ecx, dword[bufferAddr] | ||
+ | mov edx, dword[noChars] | ||
+ | call _printString | ||
+ | call _println | ||
+ | |||
+ | mov ecx, dword[saveEcx] | ||
+ | loop for | ||
+ | |||
+ | ;;; exit() | ||
+ | |||
+ | mov eax,1 | ||
+ | mov ebx,0 | ||
+ | int 0x80 ; final system call | ||
+ | |||
+ | </source> | ||
+ | <br /> | ||
+ | ==Problem 2== | ||
+ | <br /> | ||
+ | ::<source lang="asm"> | ||
+ | |||
+ | ;;; ; hw5b.asm | ||
+ | ;;; ; D. Thiebaut | ||
+ | ;;; ; | ||
+ | ;;; ------------------------------------------------------------ | ||
+ | ;;; data areas | ||
+ | ;;; ------------------------------------------------------------ | ||
+ | |||
+ | section .data | ||
+ | prompt db "> " | ||
+ | bufferAddr dd 0 | ||
+ | noChars dd 0 | ||
+ | saveEcx dd 0 | ||
+ | |||
+ | ;;; ------------------------------------------------------------ | ||
+ | ;;; code area | ||
+ | ;;; ------------------------------------------------------------ | ||
+ | |||
+ | section .text | ||
+ | global _start | ||
+ | extern _getString | ||
+ | extern _printString | ||
+ | extern _println | ||
+ | |||
+ | _start: | ||
+ | mov ecx, prompt | ||
+ | mov edx, 2 | ||
+ | call _printString | ||
+ | |||
+ | call _getString | ||
+ | mov dword[noChars], edx | ||
+ | mov dword[bufferAddr], ecx | ||
+ | |||
+ | ;;; print string in a loop that goes the same # of times | ||
+ | ;;; as the number of chars in the string. | ||
+ | |||
+ | mov ecx, dword[noChars] | ||
+ | |||
+ | for: mov edx, ecx | ||
+ | mov dword[saveEcx], ecx | ||
+ | |||
+ | mov ecx, dword[bufferAddr] | ||
+ | call _printString | ||
+ | call _println | ||
+ | |||
+ | mov ecx, dword[saveEcx] | ||
+ | loop for | ||
+ | |||
+ | ;;; exit() | ||
+ | |||
+ | mov eax,1 | ||
+ | mov ebx,0 | ||
+ | int 0x80 ; final system call | ||
+ | |||
+ | |||
+ | </source> | ||
+ | <br /> | ||
+ | ==Problem 3== | ||
+ | <br /> | ||
+ | ::<source lang="asm"> | ||
+ | ;;; ; hw5c.asm | ||
+ | ;;; ; D. Thiebaut | ||
+ | ;;; ; | ||
+ | ;;; ; ------------------------------------------------------------------- | ||
+ | |||
+ | ;;; ------------------------------------------------------------ | ||
+ | ;;; data areas | ||
+ | ;;; ------------------------------------------------------------ | ||
+ | |||
+ | section .data | ||
+ | prompt db "> " | ||
+ | bufferAddr dd 0 | ||
+ | noChars dd 0 | ||
+ | saveEcx dd 0 | ||
+ | |||
+ | ;;; ------------------------------------------------------------ | ||
+ | ;;; code area | ||
+ | ;;; ------------------------------------------------------------ | ||
+ | |||
+ | section .text | ||
+ | global _start | ||
+ | extern _getString | ||
+ | extern _printString | ||
+ | extern _println | ||
+ | |||
+ | _start: | ||
+ | mov ecx, prompt | ||
+ | mov edx, 2 | ||
+ | call _printString | ||
+ | |||
+ | call _getString | ||
+ | mov dword[noChars], edx | ||
+ | mov dword[bufferAddr], ecx | ||
+ | |||
+ | ;;; print string in a loop that goes the same # of times | ||
+ | ;;; as the number of chars in the string. | ||
+ | |||
+ | mov ecx, dword[noChars] | ||
+ | |||
+ | for: mov edx, ecx | ||
+ | neg edx | ||
+ | add edx, dword[noChars] | ||
+ | inc edx | ||
+ | |||
+ | mov dword[saveEcx], ecx | ||
+ | |||
+ | mov ecx, dword[bufferAddr] | ||
+ | call _printString | ||
+ | call _println | ||
+ | |||
+ | mov ecx, dword[saveEcx] | ||
+ | loop for | ||
+ | |||
+ | ;;; exit() | ||
+ | |||
+ | mov eax,1 | ||
+ | mov ebx,0 | ||
+ | int 0x80 ; final system call | ||
+ | |||
+ | </source> | ||
+ | <br /> | ||
+ | ==Problem 4== | ||
+ | <br /> | ||
+ | ::<source lang="asm"> | ||
+ | ;;; ; hw5d.asm | ||
+ | ;;; ; D. Thiebaut | ||
+ | ;;; ; | ||
+ | ;;; ; ------------------------------------------------------------------- | ||
+ | |||
+ | ;;; ------------------------------------------------------------ | ||
+ | ;;; data areas | ||
+ | ;;; ------------------------------------------------------------ | ||
+ | |||
+ | section .data | ||
+ | prompt db "> " | ||
+ | bufferAddr dd 0 | ||
+ | noChars dd 0 | ||
+ | checksum db 0 | ||
+ | |||
+ | ;;; ------------------------------------------------------------ | ||
+ | ;;; code area | ||
+ | ;;; ------------------------------------------------------------ | ||
+ | |||
+ | section .text | ||
+ | global _start | ||
+ | extern _getString | ||
+ | extern _printInt | ||
+ | extern _println | ||
+ | extern _printString | ||
+ | |||
+ | _start: | ||
+ | mov ecx, prompt | ||
+ | mov edx, 2 | ||
+ | call _printString | ||
+ | |||
+ | call _getString | ||
+ | mov dword[noChars], edx | ||
+ | mov dword[bufferAddr], ecx | ||
+ | |||
+ | |||
+ | ;;; Get ready to scan the string and xor each char with al, | ||
+ | ;;; which we use as a checksum | ||
+ | |||
+ | mov ecx, dword[noChars] | ||
+ | mov edx, dword[bufferAddr] | ||
+ | mov eax, 0 | ||
+ | |||
+ | ;;; loop through the string | ||
+ | for: xor al, byte[edx] | ||
+ | inc edx | ||
+ | loop for | ||
+ | |||
+ | ;;; display the checksum in decimal | ||
+ | call _printInt | ||
+ | call _println | ||
+ | ;;; exit() | ||
+ | |||
+ | mov eax,1 | ||
+ | mov ebx,0 | ||
+ | int 0x80 ; final system call | ||
+ | |||
+ | </source> | ||
+ | <br /> | ||
+ | </showafterdate> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | [[Category:CSC231]][[Category:Homework]] |
Latest revision as of 09:38, 7 November 2017
--D. Thiebaut (talk) 09:27, 30 October 2017 (EDT)
This assignment is due Monday 11/6/2017 at 11:55 p.m.
Note: you will not be given the ability to evaluate your program on Moodle, and see its final grade. For this reason, make sure you thoroughly test your programs before submitting them!
Contents
Preparation
For this assignment you will need to downloaded an updated version of 231Lib.asm, which has been augmented with a new function for reading strings.
getcopy 231Lib.asm
An example program using the new function, _getString(), is shown below:
;;; ; hw5Prep.asm ;;; ; D. Thiebaut ;;; ; ;;; ; Gets a string from the user and prints it back ;;; ; ;;; ; to assemble and run: ;;; ; ;;; ; nasm -f elf hw5Prep.asm ;;; ; nasm -f elf 231Lib.asm ;;; ; ld -melf_i386 -o hw5Prep hw5Prep.o 231Lib.o ;;; ; ./hw5Prep ;;; ; ------------------------------------------------------------------- ;;; ------------------------------------------------------------ ;;; data areas ;;; ------------------------------------------------------------ section .data prompt db "> " ;;; ------------------------------------------------------------ ;;; code area ;;; ------------------------------------------------------------ section .text global _start extern _getString extern _printString extern _println _start: ;; prompt the user mov ecx, prompt mov edx, 2 call _printString ;; get a string from the user ;; _getString returns the address of the string read in ecx, ;; and the number of chars read in edx call _getString ;; since ecx and edx already contain the address and number ;; of chars, we can directly call _printString, which needs ;; the string and number of chars in the same registers call _printString ;; print a line-feed char. call _println ;;; exit() mov eax,1 mov ebx,0 int 0x80 ; final system call
Create a version of this program in your account, and play with it. Verify that it gets a string from you and prints it back.
Notes
- _getString saves the string in an array declared inside 231Lib.asm. This array contains at most 1000 bytes.
- when _getString returns to your main program, it will set ecx to the address of the array containing the string, and it will set edx to contain the number of characters the user typed at the keyboard.
- the user indicates the end of the string by pressing the ENTER key. The string does not contain the ENTER character (line-feed).
- although I didn't do that here because the program is so simple and short, it is a good idea, just after returning from a call to _getString, to save ecx and edx into two different variables in memory that will hold the address of the string and the number of chars entered at the keyboard.
Problem 1
Write a program called hw5a.asm that prompts the user for a string, and prints it back several times. The number of times the string is printed is the same as the number of characters in the string.
- Examples
cs231a@aurora ~ $ ./hw5a > B B
cs231a@aurora ~ $ ./hw5a > a a
cs231a@aurora ~ $ ./hw5a > hello hello hello hello hello hello
cs231a@aurora $ ./hw5a > chocolate chocolate chocolate chocolate chocolate chocolate chocolate chocolate chocolate chocolate
cs231a@aurora $ ./hw5a > Hall o ween Hall o ween Hall o ween Hall o ween Hall o ween Hall o ween Hall o ween Hall o ween Hall o ween Hall o ween Hall o ween Hall o ween
Note
- Your program does not have to handle 0-length strings. In other words, your program will not be tested with empty strings.
Submission
- Submit your program in the Homework 5, Problem 1 section on Moodle.
Problem 2
Modify your solution program for Problem 1 so that it removes the last character of the previous printed string as it goes through the loop:
- Examples
cs231a@aurora $ ./hw5b > Hall-o-ween Hall-o-ween Hall-o-wee Hall-o-we Hall-o-w Hall-o- Hall-o Hall- Hall Hal Ha H
cs231a@aurora $ ./hw5b > a a
cs231a@aurora ~/HWs/HW5/PB2 $ ./hw5b > 123456789 123456789 12345678 1234567 123456 12345 1234 123 12 1
Submission
- Submit your program in the Homework 5, Problem 2 section on Moodle.
Problem 3
Same as with Problem 2, but this time the triangle is reversed:
- Example
cs231a@aurora $ ./hw5c > Hal-lo-we-en H Ha Hal Hal- Hal-l Hal-lo Hal-lo- Hal-lo-w Hal-lo-we Hal-lo-we- Hal-lo-we-e Hal-lo-we-en
Submission
- Submit your program to the Homework 5, Problem 3 section on Moodle.
Problem 4
- Write a program called hw4d.asm that prompts the user for a string, and displays the checksum of this string, in decimal.
- The checksum of a string is the exclusive or of all the bytes in a string. This is an operation used mostly in communication, when bytes of data are sent over a network. In general, when a packet of bytes is sent, the exclusive or of all the bytes is computed, and sent at the end, as an extra byte. The receiving device, upon receiving the data, will compute the exclusive or of all the data bytes, and compare the checksum it computed to the checksum that was sent. If the two checksums are different, very likely a transmission error occurred and the receiving device will ask for the packet to be transmitted again.
- Here is how you would compute the checksum of a string of 5 bytes: 0x41, 0x42, 0x43, 0x44, 0x45. I will use binary, as it is simpler:
checksum <-- 0x41 = 0100 0001 checksum <-- checksum xor 0x42 = 0100 0001 xor 0100 0010 = 0000 0011 checksum <-- checksum xor 0x43 = 0000 0011 xor 0100 0011 = 0100 0000 checksum <-- checksum xor 0x44 = 0100 0000 xor 0100 0100 = 0000 0100 checksum <-- checksum xor 0x45 = 0000 0100 xor 0100 0101 = 0100 0001
- The checksum of the 5 bytes is 0100 0001, or 0x41, or 65. The program will print 65 as the checksum for the string ABCDE.
- Examples
cs231a@aurora ~ $ ./hw5d > hello there 44
cs231a@aurora ~ $ ./hw5d > ABCDE 65
cs231a@aurora ~ $ ./hw5d > AA 0
cs231a@aurora ~ $ ./hw5d > Hello! 99
cs231a@aurora ~ $ ./hw5d > I like milk chocolate better than dark chocolate. 80
Submission
Submit your program on Moodle, in the Homework 5, Problem 4 section.
<showafterdate after="20171107 00:00" before="20171231">
Solutions
Problem 1
;;; ; hw5a.asm ;;; ; D. Thiebaut ;;; ; ;;; ; ;;; ; ------------------------------------------------------------------- ;;; ------------------------------------------------------------ ;;; data areas ;;; ------------------------------------------------------------ section .data prompt db "> " bufferAddr dd 0 noChars dd 0 saveEcx dd 0 ;;; ------------------------------------------------------------ ;;; code area ;;; ------------------------------------------------------------ section .text global _start extern _getString extern _printString extern _println _start: mov ecx, prompt mov edx, 2 call _printString call _getString mov dword[noChars], edx mov dword[bufferAddr], ecx ;;; print string in a loop that goes the same # of times ;;; as the number of chars in the string. mov ecx, dword[noChars] for: mov dword[saveEcx], ecx mov ecx, dword[bufferAddr] mov edx, dword[noChars] call _printString call _println mov ecx, dword[saveEcx] loop for ;;; exit() mov eax,1 mov ebx,0 int 0x80 ; final system call
Problem 2
;;; ; hw5b.asm ;;; ; D. Thiebaut ;;; ; ;;; ------------------------------------------------------------ ;;; data areas ;;; ------------------------------------------------------------ section .data prompt db "> " bufferAddr dd 0 noChars dd 0 saveEcx dd 0 ;;; ------------------------------------------------------------ ;;; code area ;;; ------------------------------------------------------------ section .text global _start extern _getString extern _printString extern _println _start: mov ecx, prompt mov edx, 2 call _printString call _getString mov dword[noChars], edx mov dword[bufferAddr], ecx ;;; print string in a loop that goes the same # of times ;;; as the number of chars in the string. mov ecx, dword[noChars] for: mov edx, ecx mov dword[saveEcx], ecx mov ecx, dword[bufferAddr] call _printString call _println mov ecx, dword[saveEcx] loop for ;;; exit() mov eax,1 mov ebx,0 int 0x80 ; final system call
Problem 3
;;; ; hw5c.asm ;;; ; D. Thiebaut ;;; ; ;;; ; ------------------------------------------------------------------- ;;; ------------------------------------------------------------ ;;; data areas ;;; ------------------------------------------------------------ section .data prompt db "> " bufferAddr dd 0 noChars dd 0 saveEcx dd 0 ;;; ------------------------------------------------------------ ;;; code area ;;; ------------------------------------------------------------ section .text global _start extern _getString extern _printString extern _println _start: mov ecx, prompt mov edx, 2 call _printString call _getString mov dword[noChars], edx mov dword[bufferAddr], ecx ;;; print string in a loop that goes the same # of times ;;; as the number of chars in the string. mov ecx, dword[noChars] for: mov edx, ecx neg edx add edx, dword[noChars] inc edx mov dword[saveEcx], ecx mov ecx, dword[bufferAddr] call _printString call _println mov ecx, dword[saveEcx] loop for ;;; exit() mov eax,1 mov ebx,0 int 0x80 ; final system call
Problem 4
;;; ; hw5d.asm ;;; ; D. Thiebaut ;;; ; ;;; ; ------------------------------------------------------------------- ;;; ------------------------------------------------------------ ;;; data areas ;;; ------------------------------------------------------------ section .data prompt db "> " bufferAddr dd 0 noChars dd 0 checksum db 0 ;;; ------------------------------------------------------------ ;;; code area ;;; ------------------------------------------------------------ section .text global _start extern _getString extern _printInt extern _println extern _printString _start: mov ecx, prompt mov edx, 2 call _printString call _getString mov dword[noChars], edx mov dword[bufferAddr], ecx ;;; Get ready to scan the string and xor each char with al, ;;; which we use as a checksum mov ecx, dword[noChars] mov edx, dword[bufferAddr] mov eax, 0 ;;; loop through the string for: xor al, byte[edx] inc edx loop for ;;; display the checksum in decimal call _printInt call _println ;;; exit() mov eax,1 mov ebx,0 int 0x80 ; final system call
</showafterdate>