Difference between revisions of "CSC231 DDD Short Tutorial"

From dftwiki3
Jump to: navigation, search
Line 1: Line 1:
 
--[[User:Thiebaut|D. Thiebaut]] ([[User talk:Thiebaut|talk]]) 20:25, 4 April 2017 (EDT)
 
--[[User:Thiebaut|D. Thiebaut]] ([[User talk:Thiebaut|talk]]) 20:25, 4 April 2017 (EDT)
 
----
 
----
 +
<meta name="keywords" content="computer science, assembly language, pentium, exercise, machine language, intel" />
 +
<meta name="description" content="Dominique Thiebaut's Web Page" />
 +
<meta name="title" content="Dominique Thiebaut -- Computer Science" />
 +
<meta name="abstract" content="Dominique Thiebaut's Computer Science Web pages" />
 +
<meta name="author" content="thiebaut at cs.smith.edu" />
 +
<meta name="distribution" content="Global" />
 +
<meta name="revisit-after" content="10 days" />
 +
<meta name="copyright" content="(c) D. Thiebaut 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,2008" />
 +
<meta name="robots" content="FOLLOW,INDEX" />
 +
 +
 +
__TOC__
 +
 +
<br /><br />
 +
<tanbox>
 +
This tutorial will introduce you to the ddd debugger, and simple steps you can take to debug assembly programs.<br /><br />
 +
</tanbox>
 +
<br />
 +
 +
 +
=The Target Program=
 +
 +
Create a simple program that adds the contents of two variables and stores the result in a third one.
 +
 +
The data section should be something like this:
 +
<br />
 +
::<source lang="asm">
 +
                section .data
 +
a dd 3
 +
b dd 5
 +
sum dd 0
 +
table dd 6, 7, 8
 +
 +
 +
                section .text
 +
                global  _start
 +
_start:
 +
nop ; we put nops to
 +
nop ; set a breakpoint first
 +
 +
mov eax, dword[a]
 +
add eax, dword[b]
 +
mov dword[sum], eax
 +
 +
mov ebx, dword[table]
 +
add ebx, dword[table+4]
 +
mov dword[table+8], ebx
 +
 +
;;; exit                                                                                                                                   
 +
                mov    ebx, 0
 +
                mov    eax, 1
 +
                int    0x80
 +
</source>
 +
<br />
 +
Save your program as '''demoDDD.asm''', and generate the executable as follows:
 +
 +
          nasm -f elf '''-F stabs''' demoDDD.asm
 +
          ld -melf_i386  -o demoDDD demoDDD.o
 +
 +
<br />
 +
=Test=
 +
<br />
 +
Run your program... 
 +
 +
Do you see anything?
 +
 +
Should you?
 +
 +
You probably figured out that since we are not printing anything, it's impossible to know if it computed what we expected.
 +
 +
The debugger will allow us to figure it out!
 +
<br />
 +
=The DDD Debugger=
 +
<br />
 +
==Start the Debugger==
 +
<br />
 +
Start the debugger and instruct it to open the program '''demoDDD'''.  At the prompt, type:
 +
 +
          ddd  demoDDD  &
 +
 +
<br />
 +
The first thing you'll want to do is change a couple default behaviors:
 +
<br />
 +
==Configuration==
 +
<br />
 +
Before we can start using DDD, we need to change some of its default settings.
 +
 +
Select "Edit->Preferences" from the main menu. On the window that will appear, open the "Source" tab (top of the window). Then, check the "Display Source Line Numbers" option. Click OK to close the window.
 +
 +
 +
[[Image:ddd_preferences_2017.png|center|600px]]
 +
 +
 +
Next, select "Edit->GDB Settings" from the main menu. In the window that pops up, scroll approximately half way down through the list of options, until you find the option "Disassembly flavor". Change its value to "Intel" (Figure 3.2) and click on CLOSE.
 +
 +
 +
[[Image:231_ddd_preferences2.png]]
 +
 +
 +
==Running the Debugger==
 +
 +
Just follow the same steps we did in class to execute your program one step at a time, and to verify that the number 8 ends up in the variable ''result''.
 +
 +
# Click on '''Status''', '''Registers''' to see the register window
 +
# Set a '''breakpoint''' on the second NOP instruction by clicking right on the instruction
 +
# Display the 3 variables: '''Data''', then '''Memory''', then select to display 1 hex double-word at location '''&a'''.  Same thing for '''b''' and '''result'''.
 +
# Run the program by clicking '''Run''' in the tall grey window pane.  The debugger will execute the first NOP and stop on the second one.
 +
# Single step the program with '''Stepi'''.
 +
 +
=Exercise 1=
 +
 +
Edit your program so that now it computes the sum of 5 variables, a, b, c, d, and e, and saves the sum in result.
 +
 +
Single step your program and verify that it generates  the correct answer.
 +
 +
=Exercise 2=
 +
 +
Modify your program one more time and make the data section equal to this definition:
 +
 +
Fib        dd          1, 1, 0, 0, 0, 0, 0
 +
 +
And modify the code so that your program will store the sum of the first two double-words into the third double-word, the sum of the second and third double-word in the fourth, and so on.  This way your program will compute the first 7 terms of the Fibonacci sequence.
 +
 +
Debug your program and show your instructor that you end up with 1, 1, 2, 3, 5, 8, 13 in memory.
 +
 +
<br />
 +
 +
 +
<br />
 +
 +
<br />
 +
 +
<br />
 +
 +
<br />
 +
 +
<br />
 +
 +
<br />
 +
 +
<br />
 +
 +
<br />
 +
 +
<br />
 +
 +
<br />
 +
 +
<br />
 +
 +
<br />
 +
 +
<br />
 +
[[Category:CSC231]][[Category:Labs]]

Revision as of 19:33, 4 April 2017

--D. Thiebaut (talk) 20:25, 4 April 2017 (EDT)


<meta name="keywords" content="computer science, assembly language, pentium, exercise, machine language, intel" /> <meta name="description" content="Dominique Thiebaut's Web Page" /> <meta name="title" content="Dominique Thiebaut -- Computer Science" /> <meta name="abstract" content="Dominique Thiebaut's Computer Science Web pages" /> <meta name="author" content="thiebaut at cs.smith.edu" /> <meta name="distribution" content="Global" /> <meta name="revisit-after" content="10 days" /> <meta name="copyright" content="(c) D. Thiebaut 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,2008" /> <meta name="robots" content="FOLLOW,INDEX" />




This tutorial will introduce you to the ddd debugger, and simple steps you can take to debug assembly programs.



The Target Program

Create a simple program that adds the contents of two variables and stores the result in a third one.

The data section should be something like this:

                section .data
a		dd	3
b		dd	5
sum		dd	0
table		dd	6, 7, 8
	
	
                section .text
                global  _start
_start:
		nop			; we put nops to 
		nop			; set a breakpoint first

		mov	eax, dword[a]
		add	eax, dword[b] 	
		mov	dword[sum], eax

		mov	ebx, dword[table]
		add	ebx, dword[table+4]
		mov	dword[table+8], ebx
	
;;; exit                                                                                                                                    
                mov     ebx, 0
                mov     eax, 1
                int     0x80


Save your program as demoDDD.asm, and generate the executable as follows:

         nasm -f elf -F stabs demoDDD.asm
         ld -melf_i386  -o demoDDD demoDDD.o


Test


Run your program...

Do you see anything?

Should you?

You probably figured out that since we are not printing anything, it's impossible to know if it computed what we expected.

The debugger will allow us to figure it out!

The DDD Debugger


Start the Debugger


Start the debugger and instruct it to open the program demoDDD. At the prompt, type:

         ddd  demoDDD  &


The first thing you'll want to do is change a couple default behaviors:

Configuration


Before we can start using DDD, we need to change some of its default settings.

Select "Edit->Preferences" from the main menu. On the window that will appear, open the "Source" tab (top of the window). Then, check the "Display Source Line Numbers" option. Click OK to close the window.


Ddd preferences 2017.png


Next, select "Edit->GDB Settings" from the main menu. In the window that pops up, scroll approximately half way down through the list of options, until you find the option "Disassembly flavor". Change its value to "Intel" (Figure 3.2) and click on CLOSE.


231 ddd preferences2.png


Running the Debugger

Just follow the same steps we did in class to execute your program one step at a time, and to verify that the number 8 ends up in the variable result.

  1. Click on Status, Registers to see the register window
  2. Set a breakpoint on the second NOP instruction by clicking right on the instruction
  3. Display the 3 variables: Data, then Memory, then select to display 1 hex double-word at location &a. Same thing for b and result.
  4. Run the program by clicking Run in the tall grey window pane. The debugger will execute the first NOP and stop on the second one.
  5. Single step the program with Stepi.

Exercise 1

Edit your program so that now it computes the sum of 5 variables, a, b, c, d, and e, and saves the sum in result.

Single step your program and verify that it generates the correct answer.

Exercise 2

Modify your program one more time and make the data section equal to this definition:

Fib        dd          1, 1, 0, 0, 0, 0, 0

And modify the code so that your program will store the sum of the first two double-words into the third double-word, the sum of the second and third double-word in the fourth, and so on. This way your program will compute the first 7 terms of the Fibonacci sequence.

Debug your program and show your instructor that you end up with 1, 1, 2, 3, 5, 8, 13 in memory.