Difference between revisions of "CSC231 Homework 7 2015"
Line 99: | Line 99: | ||
</showafterdate> | </showafterdate> | ||
+ | |||
+ | <onlydft> | ||
+ | text = """ | ||
+ | mov eax, 0xFFFFFFFF | ||
+ | mov ebx, 0 | ||
+ | mov ecx, 0x80000000 | ||
+ | mov edx, 0x7FFFFFFF | ||
+ | mov esi, 2 | ||
+ | mov edi, 0x80000002 | ||
+ | |||
+ | call | ||
+ | mov eax, 0x01234567 | ||
+ | mov ebx, 0x000000FF | ||
+ | mov ecx, 0x00000001 | ||
+ | mov edx, 0x0 | ||
+ | mov esi, 10 | ||
+ | mov edi, 0xFFFFFFFE | ||
+ | |||
+ | call | ||
+ | """ | ||
+ | |||
+ | def printRegs( list1, list2 ): | ||
+ | print( list1 ) | ||
+ | print( list2 ) | ||
+ | for i in range( len( list1 ) ): | ||
+ | x = list2[i] | ||
+ | if x >= 0x8000000: | ||
+ | x = x - 2**32 | ||
+ | print( list1[i], format( list2[i], '08X' ), list2[i], x ) | ||
+ | |||
+ | list1 = ["eax", "ebx", "ecx", "edx", "edi", "esi" ] | ||
+ | list2 = [ 0, 0, 0, 0, 0, 0 ] | ||
+ | |||
+ | for line in text.split("\n" ): | ||
+ | line = line.strip() | ||
+ | if line.find( "call" )!= -1: | ||
+ | printRegs( list1, list2 ) | ||
+ | continue | ||
+ | for i in range( len( list1 ) ): | ||
+ | if line.find( list1[i] ) != -1: | ||
+ | list2[i] = eval( line.split( "," )[-1].strip() ) | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | </onlydft> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | [[Category:CSC231]][[Category:Nasm]][[Category:Homework]] |
Revision as of 15:31, 10 November 2015
--D. Thiebaut (talk) 11:58, 10 November 2015 (EST)
<showafterdate after="20151111 12:00" before="20151231 00:00">
Problem 1
Your assignment is to add a new function to 231Lib2.asm called _printRegs.
- Take your 231Lib.asm library and make a copy of it called 231Lib2.asm.
cp 231Lib.asm 231Lib2.asm
- Add a globalstatement at the top of the program (with the other similar statements):
global _printRegs
- Go to the end of the file and add a new function called _printRegs
- Your new function should display the contents of eax, ebx, ecx, edx, edi, and esi, in this order:
- in hexadecimal (you should have a function for that)
- as an unsigned number (_printDec will do that for you)
- as a 2's complement signed number (you have to figure this part out).
- Submit you 231Lib2.asm program to Moodle when done
Testing
- To test your new function, create a new program that will be linked with your modified library, and will display all the registers.
- Example test program:
;;; test.asm ;;; assemble and run as follows: ;;; ;;; nasm -f elf test.asm ;;; nasm -f elf 231Lib2.asm ;;; ld -melf_i386 test.o 231Lib2.o -o myTest ;;; ./myTest ;;; ;;; Extern functions that will be linked to this program ;;; they are contained in 231Lib2.asm extern _printDec extern _printString extern _println extern _getInput extern _printRegs ;;; ------------------------------------------------------ ;;; CODE SECTION ;;; ------------------------------------------------------ section .text global _start _start: mov eax, 0xFFFFFFFF mov ebx, 0 mov ecx, 0x80000000 mov edx, 0x7FFFFFFF mov esi, 2 mov edi, 0x80000002 call _printRegs call _println mov eax, 0x01234567 mov ebx, 0x000000FF mov ecx, 0x00000001 mov edx, 0x0 mov esi, 10 mov edi, 0xFFFFFFFE call _printRegs call _println
The output of the program above should be:
eax FFFFFFFF 4294967295 -1 ebx 00000000 0 0 ecx 80000000 2147483648 -2147483648 edx 7FFFFFFF 2147483647 -2147483649 edi 80000002 2147483650 -2147483646 esi 00000002 2 2 eax 01234567 19088743 19088743 ebx 000000FF 255 255 ecx 00000001 1 1 edx 00000000 0 0 edi FFFFFFFE 4294967294 -2 esi 0000000A 10 10
</showafterdate>