1. 程式人生 > >使用GDB 除錯AT&T 彙編

使用GDB 除錯AT&T 彙編

注:以下內容為學習筆記,多數是從書本、資料中得來,只為加深印象,及日後參考。然而本人表達能力較差,寫的不好。因非翻譯、非轉載,只好選原創,但多數乃摘抄,實為慚愧。但若能幫助一二訪客,幸甚!

除錯在程式設計中是不可缺少的,嘗試使用GDB 除錯一下昨晚的AT&T彙編程式碼:

[email protected]:~/program/asm/cpuid$ as -gstabs -o cpuid.o cpuid.s
[email protected]:~/program/asm/cpuid$ ls
cpuid.o  cpuid.s  cpuid.s~  makefile  makefile~
[email protected]
:~/program/asm/cpuid$ ld -o cpuid cpuid.o [email protected]:~/program/asm/cpuid$ gdb cpuid GNU gdb (GDB) 7.1-ubuntu Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i486-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/liury/program/asm/cpuid/cpuid...done. (gdb) l 1 # cpuid.s Sample program to extract the processor Vendor ID 2 .section .data 3 output: 4 .ascii "The processor Vendor ID is 'XXXXXXXXXXXX'\n" 5 6 .section .text 7 .global _start 8 9 _start: 10 movl $0, %eax # The CPUID output option(the Vendor ID string) (gdb) break *_start Breakpoint 1 at 0x8048074: file cpuid.s, line 10. (gdb) r Starting program: /home/liury/program/asm/cpuid/cpuid The processor Vendor ID is 'GenuineIntel' Program exited normally. (gdb) q

發現斷點處沒有停,後來得知此乃GDB的一個BUG...而必須在_start後面的第一個指令碼元素的位置包含一條偽指令。
需要在_start後面加一條NOP指令:

_start:
	nop
	movl	$0,	%eax
	cpuid
[email protected]:~/program/asm/cpuid$ gdb cpuid
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/liury/program/asm/cpuid/cpuid...done.
(gdb) l
1	# cpuid.s Sample program to extract the processor Vendor ID
2	.section .data
3	output:
4		.ascii "The processor Vendor ID is 'XXXXXXXXXXXX'\n"
5	
6	.section .text
7	.global _start
8	
9	_start:
10		nop
(gdb) break *_start+1
Breakpoint 1 at 0x8048075: file cpuid.s, line 11.
(gdb) r
Starting program: /home/liury/program/asm/cpuid/cpuid 

Breakpoint 1, _start () at cpuid.s:11
11		movl	$0,	%eax		# The CPUID output option(the Vendor ID string)	
(gdb) next
12		cpuid
(gdb) info registers
eax            0x0	0
ecx            0x0	0
edx            0x0	0
ebx            0x0	0
esp            0xbffff0a0	0xbffff0a0
ebp            0x0	0x0
esi            0x0	0
edi            0x0	0
eip            0x804807a	0x804807a <_start+6>
eflags         0x212	[ AF IF ]
cs             0x73	115
ss             0x7b	123
ds             0x7b	123
es             0x7b	123
fs             0x0	0
gs             0x0	0
(gdb) n
13		movl	$output,%edi
(gdb) info registers
eax            0xa	10
ecx            0x6c65746e	1818588270
edx            0x49656e69	1231384169
ebx            0x756e6547	1970169159
esp            0xbffff0a0	0xbffff0a0
ebp            0x0	0x0
esi            0x0	0
edi            0x0	0
eip            0x804807c	0x804807c <_start+8>
eflags         0x212	[ AF IF ]
cs             0x73	115
ss             0x7b	123
ds             0x7b	123
es             0x7b	123
fs             0x0	0
gs             0x0	0
(gdb) print /x $ecx
$1 = 0x6c65746e
(gdb) x /42cb &output
0x80490ac <output>:	84 'T'	104 'h'	101 'e'	32 ' '	112 'p'	114 'r'	111 'o'	99 'c'
0x80490b4 <output+8>:	101 'e'	115 's'	115 's'	111 'o'	114 'r'	32 ' '	86 'V'	101 'e'
0x80490bc <output+16>:	110 'n'	100 'd'	111 'o'	114 'r'	32 ' '	73 'I'	68 'D'	32 ' '
0x80490c4 <output+24>:	105 'i'	115 's'	32 ' '	39 '\''	88 'X'	88 'X'	88 'X'	88 'X'
0x80490cc <output+32>:	88 'X'	88 'X'	88 'X'	88 'X'	88 'X'	88 'X'	88 'X'	88 'X'
0x80490d4 <output+40>:	39 '\''	10 '\n'
(gdb) c
Continuing.
The processor Vendor ID is 'GenuineIntel'

Program exited normally.
(gdb) q

註釋:

break 加斷點

run 執行

next 單步執行

info registers 顯示所有暫存器的值

print 顯示特定暫存器的值

print /d 顯示十進位制的值

print /t 顯示二進位制的值

print /x 顯示十六進位制的值

x 顯示特定記憶體地址的內容

x /nyz

n是要顯示的欄位數,y是輸出格式:

c 用於字元

d 十進位制

x 十六進位制
z是要顯示的欄位長度

b 位元組8位

h 16位

w 32位字


q 退出gdb

相關推薦

使用GDB 除錯AT&T 彙編

注:以下內容為學習筆記,多數是從書本、資料中得來,只為加深印象,及日後參考。然而本人表達能力較差,寫的不好。因非翻譯、非轉載,只好選原創,但多數乃摘抄,實為慚愧。但若能幫助一二訪客,幸甚! 除錯在程式設計中是不可缺少的,嘗試使用GDB 除錯一下昨晚的AT&T彙編程

Linux下gdb顯示intel和at&t彙編

在windows下使用習慣了intel彙編,在Linux下看的難受,在gdb下使用 set disassembly-flavor intel  轉換為intel格式的彙編 set disassembly-flavor att 轉換為att格式的彙編

AT&T 彙編移位運算

 1.移位乘法       sal destination       sal %c1, destination       sal shifter, destination       第一種格式destination的值向左移1位,這等同於使值乘以2.  線第二種

linux-AT&T彙編,把32位暫存器的值以16進位制字串打印出來

將暫存器的值以16進位制顯示,程式如下:.section .bbs .lcomm buf,10 #定義一個10位元組長度的記憶體區,用來儲存計算出來的字元 .section .text .globl _start _start: //初始化暫存器 movl $0x01abc

Linux 下 AT&T彙編

注:以下內容為學習筆記,多數是從書本、資料中得來,只為加深印象,及日後參考。然而本人表達能力較差,寫的不好。因非翻譯、非轉載,只好選原創,但多數乃摘抄,實為慚愧。但若能幫助一二訪客,幸甚! 大約一年前第三次嘗試自己寫一個玩具作業系統核心玩,寒假時寫到記憶體分頁,沒有搞定,

關於AT&T彙編和c語言的相互呼叫的分析

這方面很多人寫了blog,這次我也是學習,從objdump等工具分析。 ------------------------c中調用匯編------------------------------- 首先給出c檔案 #include<stdio.h> int m

經常聽說AT&T彙編、Intel彙編,還能聽到ARM彙編,這個ARM彙編與前兩個有什麼關聯?

origin: https://zhidao.baidu.com/question/424592744355848412.htmlAT&T彙編和Intel彙編,是兩種不同組合語言格式,與具體CPU關係不大,只是

AT&T彙編學習總結二-組合語言程式範例

第四章組合語言範例 建立簡單程式 CPUID指令:CPUID指令是一條彙編指令,不容易從高階語言應用程式執行它。它是請求處理器的特定資訊並且把資訊返回到特定暫存器中的低階指令。 CPUID指令使用

AT&T彙編心得之間接定址和LEA指令

AT&T彙編心得(1)定址方式:0x4(%esp)的操作是把暫存器esp中的值取出,然後加上4,得到的值作為地址,間接定址得到需要的資料例如:pushl -0x4(%ecx)該指令的含義是取出暫存器ecx的值,減去4,將得到的值作為地址,在記憶體找到該地址對應的值,將

轉intel彙編AT&T彙編的區別

因為在linux的核心中,很多跟底層硬體接觸的都使用匯編語言,但是Linux不僅使用一種組合語言,除了Intel的組合語言之外,還是用AT&T的組合語言,因此可以說這兩個是一個基礎,Intel的彙編相信很多學計算機的人都學習過,但是AT&T的就不一定了,個人認

AT&T彙編格式

絕大多數 Linux 程式設計師以前只接觸過DOS/Windows 下的組合語言,這些彙編程式碼都是 Intel 風格的。但在 Unix 和 Linux 系統中,更多采用的還是 AT&

關於AT&T 彙編:64 位與32 位的區別

下面列出一些不同之處,可以參考這個文件,將會有更詳細的資訊(System V Application Binary Interface AMD64 Architecture Processor Supplement)。 1. 64位系統中函式呼叫不再採用單純壓棧的方式:下

從零開始搭建環境編寫作業系統 AT&T GCC (七)GDB除錯和-monitor

  一直有個小教程沒有寫給大家,那就是使用GDB除錯和-monitor除錯,借這次程式碼整理,跟大家說一下怎麼用。這裡我使用到了objdump工具,gdb除錯工具,這些工具都可以直接apt-get獲得。當然我還用到了qemu的自帶除錯功能-monitor   

Linux下的AT T語法 即GNU as 彙編語法 入門

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

AT&T 彙編移位運算

 1.移位乘法       sal destination       sal %c1, destination       sal shifter, destination &nbs

AT&T 彙編四則運算

1 :加法    1.1  add   source ,destination     ADD指令可以將8,16,32位指令相加。其中b(用於位元組),w(用於字),或者l(用於漢字)     使用add指令

C指標原理(1)-AT&T彙編

 彙編在LINUX系統下的意義遠遠大於WINDOWS系統,LINUX核心部分程式碼就是彙編編寫的。然後,絕大多數 Linux 程式設計師以前只接觸過DOS/Windows 下的組合語言,這些彙編程式碼都是 Intel 風格的。但在 Unix 和 Linux 系統中,更多采用的還是 AT&T

x86彙編——gdb 除錯

gdb       //執行命令 file math  //使用的可執行程式檔名 set disassembly-flavor intel              &

AT&T彙編簡介

AT&T彙編簡介 Intel 386彙編與AT&T區別 AT&T語法與Intel彙編程式使用的語法很不一樣,他們之間的主要區別有以下幾點: AT&T語法中立即運算元前面要加一個字元$,暫存器運算元前要加%;絕對跳轉運算元前面要加星號*

AT&T風格與Intel風格的x86彙編語法區別

在討論這兩種不同的x86彙編語法之前,我們先簡要介紹一下它們各自的發展歷史: Intel公司是x86架構處理器的締造者,其第一款x86架構的處理器就是大名鼎鼎的8086,誕生於1978年6月8日。隨著x86架構處理器一起問世的還有x86的機器碼,也就是能被x