移動資料
條件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...