<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>coding &#187; nasm</title>
	<atom:link href="http://www.coding.com.br/tag/nasm/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.coding.com.br</link>
	<description>have you coded today?</description>
	<lastBuildDate>Thu, 18 Aug 2011 17:29:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Depurando programas em assembly no GNU/Linux (parte 1)</title>
		<link>http://www.coding.com.br/programacao/depurando-programas-em-assembly-no-gnulinux-parte-1/</link>
		<comments>http://www.coding.com.br/programacao/depurando-programas-em-assembly-no-gnulinux-parte-1/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 02:41:03 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[assembly]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[intel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nasm]]></category>
		<category><![CDATA[x86]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=276</guid>
		<description><![CDATA[Embora eu particularmente prefira a sintaxe AT&#38;T à Intel. Estou tendo que aprender a usá-la (e bem). Para os estudos optei pelo NASM, GNU ld e o GDB. Um processo simples, descrito abaixo:
#nasm -g -f elf programa.asm 
#ld programa.o
#gdb -q a.out
Vamos fazer um pequeno programa teste que carrega no registro ecx o valor da variável [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Embora eu particularmente <a href="http://www.ibm.com/developerworks/linux/library/l-gas-nasm.html">prefira</a> a sintaxe AT&amp;T à Intel. Estou <a href="http://www.unifei.edu.br">tendo</a> que aprender a usá-la (e bem). Para os estudos optei pelo <a href="http://www.nasm.us/">NASM</a>, <a href="http://www.gnu.org/software/binutils/">GNU ld</a> e o <a href="http://www.gnu.org/software/gdb/">GDB</a>. Um processo simples, descrito abaixo:</p>
<p style="padding-left: 30px;">#<strong>nasm</strong> -g -f elf <span style="color: #000000;">programa.asm </span><br />
#<strong>ld</strong> <span style="color: #000000;">programa.o</span><br />
#<strong>gdb</strong> -q <span style="color: #000000;">a.out</span></p>
<p>Vamos fazer um pequeno programa teste que carrega no registro <em>ecx</em> o valor da variável (var1) e em <em>edx</em> seu endereço:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">section <span style="color: #000000; font-weight: bold;">.data</span>
&nbsp;
   var1 <span style="color: #000000; font-weight: bold;">dd</span> <span style="color: #0000ff;">40</span>
&nbsp;
section <span style="color: #339933;">.</span>text
&nbsp;
   global _start
&nbsp;
   _start<span style="color: #339933;">:</span>
      <span style="color: #00007f; font-weight: bold;">nop</span>
      <span style="color: #00007f; font-weight: bold;">nop</span>
      <span style="color: #00007f; font-weight: bold;">mov</span>   <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">&#91;</span>var1<span style="color: #009900; font-weight: bold;">&#93;</span>
      <span style="color: #00007f; font-weight: bold;">lea</span>   <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">&#91;</span>var1<span style="color: #009900; font-weight: bold;">&#93;</span>
&nbsp;
   _exit<span style="color: #339933;">:</span>
      <span style="color: #00007f; font-weight: bold;">mov</span>   <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">1</span>
      <span style="color: #00007f; font-weight: bold;">int</span>   <span style="color: #0000ff;">80h</span></pre></div></div>

<p>Dentro do gdb:</p>
<pre>(gdb) break 11
Breakpoint 1 at 0x80480a1: file teste.asm, line 11.
(gdb) r
Starting program: /home/maluta/coding/a.out
Breakpoint 1, _start () at teste.asm:11
11            nop
(gdb) print var1
$1 = 40
(gdb) info registers ecx edx
ecx            0x0      0
edx            0x0      0</pre>
<p>Adicionamos um <a href="http://sourceware.org/gdb/current/onlinedocs/gdb_6.html#SEC34">breakpoint</a> (eu precisei inserir duas instruções <em>nop</em> para o gdb realmente para no ponto) e verificamos os valores de <strong>var1</strong>, <strong>ecx</strong> e <strong>edx</strong>.</p>
<pre>(gdb) si
_start () at teste.asm:12
12            mov   ecx, [var1]
(gdb) si
_start () at teste.asm:13
13            lea   edx, [var1]
(gdb) info registers ecx
ecx            0x28     40
(gdb) si
_exit () at teste.asm:16
16            mov   eax, 1
(gdb) info registers edx
edx            0x80490b8        134516920</pre>
<p>E por fim, verificamos o conteúdo no endereço definido em edx.</p>
<pre>(gdb) print *0x80490b8
$2 = 40</pre>
<p style="text-align: justify;">Algumas considerações:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">O <a href="http://www.gnu.org/software/ddd/">Data Diplay Debugger</a> (DDD) é um <em>front-end</em> muito bom para o GDB que pode ser utilizado ao invés da interface de linha de comando.</li>
</ul>
<ul style="text-align: justify;">
<li style="text-align: justify;">O após <em>label</em> <strong>_exit </strong>há uma chamada a uma <em>syscall</em> (adivinha qual?) do <a href="http://www.kernel.org">kernel</a>. Passa-se o valor (no registro eax) e chama uma interrupção (80h).  A verdadeira &#8220;diversão&#8221; está em associar essas syscalls (write, fork, execve, &#8230;) mas isto é para outro <em>post</em>&#8230; Por enquanto vou lidar com os diferentes modos de endereçamento e operações lógicas e aritméticas.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/programacao/depurando-programas-em-assembly-no-gnulinux-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
