亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C指針原理教程之AT&T匯編

2020-01-26 13:32:39
字體:
來源:轉載
供稿:網友

匯編在LINUX系統下的意義遠遠大于WINDOWS系統,LINUX內核部分代碼就是匯編編寫的。然后,絕大多數 Linux 程序員以前只接觸過DOS/Windows 下的匯編語言,這些匯編代碼都是 Intel 風格的。但在 Unix 和 Linux 系統中,更多采用的還是 AT&T 格式,兩者在語法格式上有著很大的不同,因此應對AT&T匯編應有一個基本的了解和熟悉。

    我們在LINUX下用C編寫一段最簡單的helloworld程序,命令為hello.c

#include <stdio.h> int main(){ printf("hello,world/n"); exit(0); } 

然后,使用GCC編譯,同時使用-s參數生成中間匯編代碼,看看AT&T匯編的真實面目

.section .data#初始化的變量
output:
   .ascii "hello,world/n"
   #要打印的字符串,.data為初始化值的變量。output是標簽,指示字符串開始的位置,ascii為數據類型
.section .bss#未初始化的變量,由0填充的緩沖區
   .lcomm num,20
   #lcomm為本地內存區域,即本地匯編外的不能進行訪問。.comm是通用內存區域。
.section .text#匯編語言指令碼
   .globl _start#啟動入口
   _start:
   movl $4,%eax#調用的系統功能,4為write  
   movl $output,%ecx#要打印的字符串
   movl $1,%ebx#文件描述符,屏幕為1  
   movl $12,%edx#字符串長度
   int $0x80#顯示字符串hello,world
   movl $0,%eax
   movl $num,%edi
   movl $65,1(%edi)#A 的ascii
   movl $66,2(%edi)#B 的ascii
   movl $67,3(%edi)#C 的ascii
   movl $68,4(%edi)#D 的ascii
   movl $10,5(%edi)#/n的ascii
   movl $4,%eax#調用的系統功能,4為write   
   movl $num,%ecx#要打印的字符串 
   movl $1,%ebx#文件描述符,屏幕為1  
   movl $6,%edx#字符串長度
   int $0x80#顯示字符串ABCD
   movl $1,%eax#1為退出
   movl $0,%ebx#返回給shell的退出代碼值
   int $0x80#內核軟中斷,退出系統

gcc -S hello.c.file  "hello.c"  .section  .rodata.LC0:  .string "hello,world"  .text.globl main  .type  main, @functionmain:  pushl  %ebp  movl  %esp, %ebp  andl  $-16, %esp  subl  $16, %esp  movl  $.LC0, (%esp)  call  puts  movl  $0, (%esp)  call  exit  .size  main, .-main  .ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"  .section  .note.GNU-stack,"",@progbits

匯編器(assembler)的作用是將用匯編語言編寫的源程序轉換成二進制形式的目標代碼。Linux 平臺的標準匯編器是 GAS,它是 GCC 所依賴的后臺匯編工具,通常包含在 binutils 軟件包中。
AT&T匯編主要有以下特點:
1、在 AT&T 匯編格式中,寄存器名要加上 '%' 作為前綴。

如:

把eax寄存器的內容復制到ebx中

movl %eax,%ebx
2、用 '$' 前綴表示一個立即操作數。

如:將1復制到eax中

movl $1, %eax
3、目標操作數在源操作數的右邊

movl %eax,%ebx
eax是源操作數,ebx是目標操作數
4、在 AT&T 匯編格式中,操作數的字長由操作符的最后一個字母決定,后綴'b'、'w'、'l'分別表示操作數為字節(byte,8 比特)、字(word,16 比特)和長字(long,32比特)

比如:

movl對32位進行操作,將eax寄存器32位的內容復制到ebx中

movl %eax, %ebx

movw對16位進行操作,將ax寄存器的內容復制到bx中

movw %ax, %bx

movb對8位進行操作,將al寄存器的內容復制到bl中

movb %al, %bl

我們再以入棧為例:

pushl %ecx  # 32位ecx的內容入棧

pushw %cx   # 16位ecx的內容入棧

pushl $180  # 80做為一個32位整數入棧

pushl data  # data變量內容入棧,長度為32位

pushl $data # 這一個操作很特別,在變量前面加上$表示取變量的地址,這是將data變量的地址入棧
5、在 AT&T 匯編格式中,絕對轉移和調用指(jump/call)的操作數前要加上'*'作為前綴
6、遠程轉移指令和遠程子調用指令的操作碼,在 AT&T 匯編格式中為 ljump和lcall
我們從生成的中間代碼可以看出這幾個特點。

我們再來看一段用AT&T匯編編寫的helloworld程序。

.section .data#初始化的變量output:  .ascii "hello,world/n"  #要打印的字符串,.data為初始化值的變量。output是標簽,指示字符串開始的位置,ascii為數據類型.section .bss#未初始化的變量,由0填充的緩沖區  .lcomm num,20  #lcomm為本地內存區域,即本地匯編外的不能進行訪問。.comm是通用內存區域。.section .text#匯編語言指令碼  .globl _start#啟動入口  _start:  movl $4,%eax#調用的系統功能,4為write    movl $output,%ecx#要打印的字符串  movl $1,%ebx#文件描述符,屏幕為1    movl $12,%edx#字符串長度  int $0x80#顯示字符串hello,world  movl $0,%eax  movl $num,%edi  movl $65,1(%edi)#A 的ascii  movl $66,2(%edi)#B 的ascii   movl $67,3(%edi)#C 的ascii   movl $68,4(%edi)#D 的ascii  movl $10,5(%edi)#/n的ascii   movl $4,%eax#調用的系統功能,4為write    movl $num,%ecx#要打印的字符串   movl $1,%ebx#文件描述符,屏幕為1    movl $6,%edx#字符串長度  int $0x80#顯示字符串ABCD  movl $1,%eax#1為退出  movl $0,%ebx#返回給shell的退出代碼值  int $0x80#內核軟中斷,退出系統

我們對上面這段匯編代碼的結構和內容進行解說:

1、.section .data段存放著初始化的變量, .section .bss段存放著未初始化的變量

2、變量的定義采用以下格式:
變量名:
  變量類型 變量值
上面代碼中的output變量就是這么定義的
output:
   .ascii "hello,world/n"
下面例子定義了多個變量
.section .data
msg:
.ascii “This is a text”
x:
.double 109.45, 2.33, 19.16
y:
.int 89
z:
.int 21, 85, 27
 
.equ  a 8
 
其中,msg為字符符,x為雙精度符點數,y和z為整數,a是一個特別的定義,它的是一個靜態變量的定義,使用.equ 變量名 變量值來實現

3、.section .bss段中變量訪問區域的定義規則為:

lcomm為本地內存區域,即本地匯編外的不能進行訪問,而.comm是通用內存區域
比如上面的定義
 .lcomm num,20 
num為本地內存區域。

4、section .text段為匯編語言指令碼,使用.globl _start指示_start標記后的代碼為程序啟動入口。

5、#表示注釋,上面代碼的其它部分均有注釋,有匯編基礎的程序員應很容易理解

變量的類型有以下幾種:
.ascii 文本字符串
.asciz 以NULL結束的文本字符串
.byte  字節值
.double 雙精度符點數
.float 單精度符點數
.int 32位整數
.long 32位整數
.octa 16位整數
.quad 8位整數
.short 16位整數
.single 單精度符點數

此外,AT&T匯編經常會涉及字節順序反轉,比較加載,交換,壓入彈出所有寄存器等操作,以下例子涉及了這些操作,
每行代碼都有詳細的注釋。

.bss段定義的數據元素為未初始化的變量,在運行時對其進行初始化。

可分為數據通用內存區域和本地通用內存區域

本地通用內存區域不能從本地匯編代碼之外進行訪問。

.text段存放代碼

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲另类激情另类| 精品无人国产偷自产在线| 精品国产自在精品国产浪潮| 国产一区二区三区在线视频| 亚洲欧美国产va在线影院| 91在线视频导航| 97视频免费在线观看| 日韩精品视频在线观看免费| 国内精品久久久久久中文字幕| 亚洲精品有码在线| 国产亚洲精品激情久久| 国产精品久久中文| 欧美极度另类性三渗透| 亚洲精品国产suv| 久久精品视频导航| 国产精品视频自在线| 欧美性感美女h网站在线观看免费| 欧美日韩精品在线播放| 亚洲精品一区二区网址| 日韩精品视频在线免费观看| 久久综合网hezyo| 久久视频在线直播| 91精品啪aⅴ在线观看国产| 亚洲精品二三区| 欧美在线一级va免费观看| 美女福利精品视频| 国产精品九九九| 日韩精品极品视频| 97精品一区二区视频在线观看| 亚洲国产福利在线| 欧美色视频日本高清在线观看| 亚洲国产精品高清久久久| 在线播放日韩精品| 日本欧美中文字幕| 亚洲精品影视在线观看| 98精品国产高清在线xxxx天堂| 亚洲国产又黄又爽女人高潮的| 国产精品一区专区欧美日韩| 亚洲日韩中文字幕在线播放| 国产欧美一区二区三区在线| 狠狠久久五月精品中文字幕| 成人a免费视频| 26uuu另类亚洲欧美日本老年| 日韩在线观看免费全集电视剧网站| 亚洲色图美腿丝袜| 日韩在线免费观看视频| 亚洲人成在线观看网站高清| 伊人久久久久久久久久久| 日韩一区二区欧美| 一区二区日韩精品| 欧美高清videos高潮hd| 欧美激情第一页xxx| 日韩av影院在线观看| 国产亚洲福利一区| 精品久久久久久久久久久| 国产丝袜一区视频在线观看| 欧美一级大片视频| 深夜福利亚洲导航| 国产成人涩涩涩视频在线观看| 亚洲国产欧美一区二区三区同亚洲| 国产偷国产偷亚洲清高网站| 2019中文字幕在线| 色噜噜狠狠狠综合曰曰曰| 欧美夜福利tv在线| 一级做a爰片久久毛片美女图片| 国产亚洲精品激情久久| 亚洲v日韩v综合v精品v| 热re91久久精品国99热蜜臀| 亚洲美女av在线| 国产精品久久久久久久久久久新郎| 欧美日本中文字幕| 国产精品美乳在线观看| 国产精品草莓在线免费观看| 国产精品视频内| 国产精品视频26uuu| 欧美精品在线看| 黑人与娇小精品av专区| 九九热精品视频| 欧美性在线视频| 性亚洲最疯狂xxxx高清| 亚洲美女福利视频网站| 懂色av影视一区二区三区| 欧美日韩在线观看视频小说| 国产欧美精品一区二区| 亚洲成年人在线| 在线免费观看羞羞视频一区二区| 欧美成人激情视频免费观看| 久久九九全国免费精品观看| 日韩av免费在线观看| www.日本久久久久com.| 日韩av片永久免费网站| 亚洲精品福利在线| 亚洲摸下面视频| 欧美高清在线观看| 精品亚洲男同gayvideo网站| 中文字幕亚洲欧美在线| 久久影院在线观看| 久久久久久久久久久久久久久久久久av| 精品美女永久免费视频| 7m精品福利视频导航| 日韩美女视频免费在线观看| 国产在线精品成人一区二区三区| 国产精品久久久久久久app| 中文字幕亚洲综合久久筱田步美| 久久人人爽人人爽人人片亚洲| 亚洲视频视频在线| 国产精品男人爽免费视频1| 久久久久久久久久久人体| 蜜月aⅴ免费一区二区三区| 热久久美女精品天天吊色| 欧美激情视频在线免费观看 欧美视频免费一| 日韩最新在线视频| 91高潮精品免费porn| 国产欧美日韩精品丝袜高跟鞋| 亚洲国产精品久久久久秋霞不卡| 777国产偷窥盗摄精品视频| 国产欧美欧洲在线观看| 精品国产欧美一区二区五十路| 国产成人免费91av在线| 欧美精品精品精品精品免费| 亚洲aaaaaa| 欧美日韩国产精品| 国产一区二区av| 超在线视频97| 欧美自拍视频在线| 亚洲免费精彩视频| 欧美精品一本久久男人的天堂| 亚洲精品日韩av| 亚洲精品v欧美精品v日韩精品| 国产精品视频免费在线观看| 日韩亚洲成人av在线| 亚洲欧美制服第一页| 国产一区二区免费| 黄色成人在线免费| 亚洲精品狠狠操| 亚洲在线免费看| 18一19gay欧美视频网站| 国产精品亚洲欧美导航| 亚洲精品一区二区三区婷婷月| 美女福利精品视频| 精品香蕉一区二区三区| 97成人精品区在线播放| 中文字幕精品影院| 欧美性xxxxx极品| 日韩av网站在线| 国产精品久久久久久久久影视| 国产大片精品免费永久看nba| 菠萝蜜影院一区二区免费| 亚洲最新av网址| 国产精品96久久久久久又黄又硬| 日韩欧美亚洲国产一区| 国产精品三级美女白浆呻吟| 亚洲伊人久久综合| 亚洲人精品午夜在线观看| 日韩欧美精品中文字幕| 国产成人综合av| 国产va免费精品高清在线观看| 欧美大成色www永久网站婷| 久久久久久国产三级电影| 久久精品国产久精国产一老狼| www.日韩欧美| 日韩视频免费在线观看| 亚洲精品久久久久久久久久久久久| 日韩美女av在线|