日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ATT汇编指令

發布時間:2024/9/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ATT汇编指令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AT&T匯編指令

GAS中每個操作都是有一個字符的后綴,表明操作數的大小。

C聲明

GAS后綴

大小(字節)

char

b

1

short

w

2

(unsigned) int / long / char*

l

4

float

s

4

double

l

8

long double

t

10/12

注意:GAL使用后綴“l”同時表示4字節整數和8字節雙精度浮點數,這不會產生歧義因為浮點數使用的是完全不同的指令和寄存器。

?

?

操作數格式:

格式

操作數值

名稱

樣例(GAS = C語言)

$Imm

Imm

立即數尋址

$1 = 1

Ea

R[Ea]

寄存器尋址

%eax = eax

Imm

M[Imm]

絕對尋址

0x104 = *0x104

(Ea)

M[R[Ea]]

間接尋址

(%eax)= *eax

Imm(Ea)

M[Imm+R[Ea]]

(基址+偏移量)尋址

4(%eax) = *(4+eax)

(Ea,Eb)

M[R[Ea]+R[Eb]]

變址

(%eax,%ebx) = *(eax+ebx)

Imm(Ea,Eb)

M[Imm+R[Ea]+R[Eb]]

尋址

9(%eax,%ebx)= *(9+eax+ebx)

(,Ea,s)

M[R[Ea]*s]

伸縮化變址尋址

(,%eax,4)= *(eax*4)

Imm(,Ea,s)

M[Imm+R[Ea]*s]

伸縮化變址尋址

0xfc(,%eax,4)= *(0xfc+eax*4)

(Ea,Eb,s)

M(R[Ea]+R[Eb]*s)

伸縮化變址尋址

(%eax,%ebx,4) = *(eax+ebx*4)

Imm(Ea,Eb,s)

M(Imm+R[Ea]+R[Eb]*s)

伸縮化變址尋址

8(%eax,%ebx,4) = *(8+eax+ebx*4)

注:M[xx]表示在存儲器中xx地址的值,R[xx]表示寄存器xx的值,這種表示方法將寄存器、內存都看出一個大數組的形式。

?

?

數據傳送指令:

指令

效果

描述

movl S,D

D <-- S

傳雙字

movw S,D

D <-- S

傳字

movb S,D

D <-- S

傳字節

movsbl S,D

D <--?符號擴展S

符號位填充(字節->雙字)

movzbl S,D

D <--?零擴展S

零填充(字節->雙字)

pushl S

R[%esp] <-- R[%esp] – 4;

M[R[%esp]] <-- S

壓棧

popl D

D <-- M[R[%esp]];

R[%esp] <-- R[%esp] + 4;

出棧

注:均假設棧往低地址擴展。

?

?

算數和邏輯操作地址:

指令

效果

描述

leal S,D

D = &S

movl地版,S地址入D,D僅能是寄存器

incl D

D++

加1

decl D

D--

減1

negl D

D = -D

取負

notl D

D = ~D

取反

addl S,D

D = D + S

subl S,D

D = D – S

imull S,D

D = D*S

xorl S,D

D = D ^ S

異或

orl S,D

D = D | S

andl S,D

D = D & S

sall k,D

D = D << k

左移

shll k,D

D = D << k

左移(同sall)

sarl k,D

D = D >> k

算數右移

shrl k,D

D = D >> k

邏輯右移

?

?

特殊算術操作:

指令

效果

描述

imull S

R[%edx]:R[%eax] = S * R[%eax]

無符號64位乘

mull S

R[%edx]:R[%eax] = S * R[%eax]

有符號64位乘

cltd S

R[%edx]:R[%eax] =?符號位擴展R[%eax]

轉換為4字節

idivl S

R[%edx] = R[%edx]:R[%eax] % S;

R[%eax] = R[%edx]:R[%eax] / S;

有符號除法,保存余數和商

divl S

R[%edx] = R[%edx]:R[%eax] % S;

R[%eax] = R[%edx]:R[%eax] / S;

無符號除法,保存余數和商

注:64位數通常存儲為,高32位放在edx,低32位放在eax。

?

?

條件碼:

條件碼寄存器描述了最近的算數或邏輯操作的屬性。

CF:進位標志,最高位產生了進位,可用于檢查無符號數溢出。

OF:溢出標志,二進制補碼溢出——正溢出或負溢出。

ZF:零標志,結果為0。

SF:符號標志,操作結果為負。

?

?

比較指令:

指令

基于

描述

cmpb S2,S1

S1 – S2

比較字節,差關系

testb S2,S1

S1 & S2

測試字節,與關系

cmpw S2,S1

S1 – S2

比較字,差關系

testw S2,S1

S1 & S2

測試字,與關系

cmpl S2,S1

S1 – S2

比較雙字,差關系

testl S2,S1

S1 & S2

測試雙字,與關系

?

?

訪問條件碼指令:

指令

同義名

效果

設置條件

sete D

setz

D = ZF

相等/零

setne D

setnz

D = ~ZF

不等/非零

sets D

?

D = SF

負數

setns D

?

D = ~SF

非負數

setg D

setnle

D = ~(SF ^OF) & ZF

大于(有符號>)

setge D

setnl

D = ~(SF ^OF)

小于等于(有符號>=)

setl D

setnge

D = SF ^ OF

小于(有符號<)

setle D

setng

D = (SF ^ OF) | ZF

小于等于(有符號<=)

seta D

setnbe

D = ~CF & ~ZF

超過(無符號>)

setae D

setnb

D = ~CF

超過或等于(無符號>=)

setb D

setnae

D = CF

低于(無符號<)

setbe D

setna

D = CF | ZF

低于或等于(無符號<=)

?

??

跳轉指令:

指令

同義名

跳轉條件

描述

jmp?? Label

?

1

直接跳轉

jmp?? *Operand

?

1

間接跳轉

je???? Label

jz

ZF

等于/零

jne??? Label

jnz

~ZF

不等/非零

js???? Label

?

SF

負數

jnz??? Label

?

~SF

非負數

jg???? Label

jnle

~(SF^OF) & ~ZF

大于(有符號>)

jge??? Label

jnl

~(SF ^ OF)

大于等于(有符號>=)

jl???? Label

jnge

SF ^ OF

小于(有符號<)

jle???? Label

jng

(SF ^ OF) | ZF

小于等于(有符號<=)

ja???? Label

jnbe

~CF & ~ZF

超過(無符號>)

jae??? Label

jnb

~CF

超過或等于(無符號>=)

jb???? Label

jnae

CF

低于(無符號<)

jbe??? Label

jna

CF | ZF

低于或等于(無符號<=)

?

?

轉移控制指令:(函數調用):

指令

描述

call??? Label

過程調用,返回地址入棧,跳轉到調用過程起始處,返回地址是call后面那條指令的地址

call??? *Operand

leave

為返回準備好棧,為ret準備好棧,主要是彈出函數內的棧使用及%ebp

轉載于:https://www.cnblogs.com/xiayong123/archive/2012/03/28/3717137.html

總結

以上是生活随笔為你收集整理的ATT汇编指令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。