AT T彙編移動資料

2021-10-03 15:44:47 字數 4399 閱讀 8623

移動資料

條件mov指令

交換資料

棧資料段

.data 和 .rodata

資料型別:

* ascii 字串

* asciz 0結束的字串

* byte 位元組值

* double 雙精度浮點數

* float 單精度浮點數

* int 32位整數

* long 32位整數

* octa 16位整數

* quad 8位整數

* short 16位整數

* single 單精度浮點數

示例:

.section .data

msg:

.ascii "this is a test message"

factors:

.double 37.45, 45.33, 12.30

height:

.int 54

length:

.int 62,35,47

定義靜態符號

示例:

.equ factor, 3

.equ linux_sys_call, 0x80

movl $linux_sys_call, %eax

bss 段

命令:* comm 宣告一段未初始化的記憶體區域

* .lcomm 生命一段本地的未初始化的記憶體區域(不能被其他檔案訪問)

格式:.comm sysbol, length

示例:

.section .bss

.lcomm buffer, 10000

移動命令

示例:

#movtest2.s - an example of moving register data to memory

.section .data

value:

.int 1

.section .text

.globl _start

_start:

nopmovl $100, %eax

movl %eax, value

movl $1, %eax

movl $0, %ebx

int $0x80

使用索引訪問記憶體

# movtest3.s - another example of using indexd memory locations

.section .data

output:

.asciz "the value is %d\n"

values:

.int 10, 15, 20,25,30,35,40,45,50,55,60

.section .text

.globl _start

_start:

nopmovl $0, %edi

loop:

movl values(, %edi, 4), %eax

pushl %eax

pushl $output

call printf

addl $8, %esp

inc %edi

cmpl $11, %edi

jne loop

movl $0, %ebx

movl $1, %eax

int $0x80

使用暫存器間接位址訪問

示例:

#movtest4.s - an example of indirect addressing

.section .data

values:

.int 10, 15, 20, 25, 30, 35, 40, 45, 55, 60

.section .text

.globl _start

_start:

nopmovl values, %eax

movl $values, %edi

movl $100, 4(%edi)

movl $1, %edi

movl values(, %edi, 4), %ebx

movl $1, %eax

int $0x80

無符號數跳轉

指令描述

符號位cmova/cmovnbe

大於或者不小於等於

(cf or zf) = 0

cmovae/cmovnb

大於等於或者不小於

cf=0

cmovnc

沒有進製

cf=0

cmovvb/cmovnae

小於cf=1

cmovc

有進製cf=1

cmovbe/cmovna

不大於(cf or zf) = 1

cmove/cmovz

等於zf=1

cmovne/cmovnz

不等於zf=0

cmovp/cmovpe

位元組1為偶數個

pf=1

cmovnp/cmovpo

位元組1為奇數

pf=0

有符號數跳轉

指令描述

符號位cmovge/cmovnl

大於等於

(sf xor of)=0

cmovl/cmovnge

小於(sf xor of) = 1

cmovle/vmovng

小於等於

((sf xor of) or zf) = 1

cmovo

溢位of=1

cmovno

沒有溢位

of=0

cmovs

正數sf=1

cmovns

非正sf=0

使用cmov指令

#cmovtest.s - an example of the cmov instructions

.section .data

output:

.asciz "the largest value is %d\n"

valuse:

.int 105, 235, 61, 315, 134, 221, 53, 145, 117, 5

.section .text

.globl _start

_start:

nopmovl values, %ebx

movl $1, %edi

loop:

movl values(, %edi, 4), %eax

cmp %ebx, %eax

cmova %eax, %ebx

inc %edi

cmp $10, %edi

jne loop

pushl %ebx

pushl $output

call printf

addl $8, %esp

pushl $0

call exit

資料交換指令
* xchg 交換兩個暫存器或者乙個暫存器乙個記憶體單元

* bswap 反轉32為暫存器的位元組順序

* xadd 交換兩個數並將和儲存在目的運算元

* cmpxchg 比較交換

* cmpxchg8b 比較交換兩個64位數

使用資料交換指令
# bubble.s - an example of the xchg instruction

.section .data

values:

.int 105, 235, 61, 315, 134, 221, 53, 145, 117, 5

.section .text

.globl _start

_start:

movl $values, %esi

movl $9, %ecx

movl $9, %ebx

loop:

movl (%esi), %eax

cmp %eax, 4(%esi)

jge skip

xchg %eax, 4(%esi)

movl %eax, (%esi)

skip:

add $4, %esi

dec %ebx

jnz loop

dec %ecx

jz end

movl $values, %esi

mov %ecx, %ebx

jmp loop

end:

movl $1, %eax

movl $0, %ebx

int $0x80

棧是如何工作的

出棧和入棧

*語法:

pushx source

pop destination

att格式彙編指令 關於ATT彙編

att 彙編大體格式是 指令 源運算元 目的運算元 比如將 10 移動到 eax 暫存器的寫法 movl 10,eax 1.att 彙編的源運算元和目的運算元和 intel 正好相反,也就是資料流向是從左到右 2.att 中立即數前需要加 符號,暫存器前加 符號 3.att 的指令加字尾 b w l...

AT T彙編簡介

1.暫存器引用 引用暫存器要在暫存器號前加百分號 如 movl eax,ebx 80386有如下暫存器 8個32 bit暫存器 eax,ebx,ecx,edx,edi,esi,ebp,esp 8個16 bit暫存器,它們事實上是上面8個32 bit暫存器的低16位 ax,bx,cx,dx,di,si...

ATT 彙編語法

在研華的pc104上使用看門狗要使用彙編。使用彙編來修改cmos裡面的引數。也就是內聯彙編。linux下gcc只支援att彙編。所以這兒有必要將att語法學習學習。以後需要的時候翻出來溫習溫習。1,運算元的長度 運算元的長度用加在指令後的符號表示 b byte,8 bit w word,16 bit...