C指標原理 3 AT T彙編

2021-09-13 00:25:04 字數 2926 閱讀 4112

./hello

hello,world

abcd

gdb做為linux程式設計師的乙個重要的除錯工具,同樣適用於彙編編寫的程式,我們用gdb對上面**進行一些簡單的除錯操作

首先開啟hello程式:

gdb hello

gnu gdb (gdb) 7.1-ubuntu

license gplv3+: gnu gpl version 3 or later 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 "x86_64-linux-gnu".

for bug reporting instructions, please see:

...reading symbols from /home/deepfuture-lx/private/mytest/hello...done.

然後,我們可以使用list命令列出源**

(gdb) list

1 .section .data#初始化的變數

2 output:

3 .ascii "hello,world\n"

4 #要列印的字串,.data為初始化值的變數。output是標籤,指示字串開始的位置,ascii為資料型別

5 .section .bss#未初始化的變數,由0填充的緩衝區

6 .lcomm num,20

7 #lcomm為本地記憶體區域,即本地彙編外的不能進行訪問。.comm是通用記憶體區域。

8 .section .text#組合語言指令碼

9 .globl _start#啟動入口

10 _start:

使用break命令設定斷點

(gdb) break 17

breakpoint 1 at 0x4000c6: file hello.s, line 17.

執行至斷點

(gdb) run

starting program: /home/deepfuture-lx/private/mytest/hello

hello,world

breakpoint 1, _start () at hello.s:17

繼續執行下條語句

17 movl $0,%eax

(gdb) next

18 movl $num,%edi

顯示所有暫存器的值

(gdb) info registers

rax 0x0 0

rbx 0x1 1

rcx 0x60011c 6291740

rdx 0xc 12

rsi 0x0 0

rdi 0x0 0

rbp 0x0 0x0

rsp 0x7fffffffe2d0 0x7fffffffe2d0

r8 0x0 0

r9 0x0 0

r10 0x0 0

r11 0x0 0

r12 0x0 0

r13 0x0 0

r14 0x0 0

r15 0x0 0

rip 0x4000cb 0x4000cb <_start+27>

eflags 0x202 [ if ]

cs 0x33 51

ss 0x2b 43

ds 0x0 0

es 0x0 0

fs 0x0 0

---type to continue, or q to quit---

gs 0x0 0

(gdb) next

19 movl $65,1(%edi)#a 的ascii

按十六進製制格式輸出edi暫存器的值。/x表示16進製制,/d表示10進製,/t表示二進位制

(gdb) print/x $rdi

$3 = 0x600128

繼續執行

(gdb) next

20 movl $66,2(%edi)#b 的ascii

顯示某個記憶體位置的值,x/nyz,其中n為字段數,y為格式(c為字元,d為10進製,x為16進製制),z為字段長度(b為位元組,n為16位字,w為32位字)

(gdb) next

21 movl $67,3(%edi)#c 的ascii

(gdb) x/3cb &num

0x600128 : 0 '\000' 65 'a' 66 'b'

(gdb) next

22 movl $68,4(%edi)#d 的ascii

(gdb) next

23 movl $10,5(%edi)#\n的ascii

(gdb) next

25 movl $4,%eax#呼叫的系統功能,4為write

(gdb) x/4cb &num

0x600128 : 0 '\000' 65 'a' 66 'b' 67 'c'

退出gdb

(gdb)quit

C指標原理 7 C內嵌彙編

如何在內聯彙編中訪問c程式的區域性變數呢,請看下面這段 include int main void 這個例子完成這個計算 xa xb 2 6 2 2 16 不使用全域性變數與彙編 互動,我們必須使用擴充套件gnu的asm 格式為 asm 彙編 輸出位置 輸入位置 改動的暫存器列表 彙編 中涉及暫存器...

AT T學習筆記彙編之內聯c語言

asm assembly code ansi c將asm用於其它用途,用 asm 替換 在asm後面加上 volatile可以禁止編譯器優化 asm volatile pusha n tpopa asm volatile pushl 1 n t 擴充套件asm asm asm code output...

att格式彙編指令 匯程式設計序基本原理知識筆記

1 組合語言的概念 定義 為特定計算機或計算機系統設計的面向機器的符號化程式語言。匯程式設計序也就是用組合語言編寫的程式。計算機要執行匯程式設計序需要用專門的翻譯程式進行翻譯,然後計算機才可以識別。彙編語句的分類 指令語句 偽指令語句和巨集指令語句 1.1 指令語句 又稱機器 指令語句,翻譯後能夠產...