比較得到數(shù)組最大數(shù)
寫一個比較得到最大數(shù)的匯編, 注意:
- long是4字節(jié)
- movl, mov運用在不同范圍的數(shù)字, mov會搬運64位數(shù)字(超過了long的長度), movl會搬運32位(剛好是long的長度)
- rdx, edx是同一寄存器上的不同范圍, rdx是64位, edx是32位
- 立即數(shù)尋址要加
$
真是耗費了我好些經(jīng)歷, 寫了一整天, 每次都報錯
segment fault
(其實是因為對數(shù)的范圍和尋址不敏感, 導(dǎo)致訪問了非法內(nèi)存).
為此還學(xué)習(xí)了一番gdb調(diào)試, 真不戳!
.section .data
data_items:
.long 3, 74, 34, 222, 34, 75, 54, 34, 44, 33, 22, 11, 66
len = . - data_items
.section .text
.globl _start
_start:
mov $-4, %rdi
movl data_items(,1), %ebx
start_loop:
add $4, %rdi
# 比較是否到最后一個元素
cmp $len, %rdi
jae exit_loop
# 取元素比較大小
movl data_items(, %rdi), %eax
cmp %rax, %rbx
jle assign_max
jmp start_loop
assign_max:
mov %rax, %rbx
jmp start_loop
exit_loop:
mov $1, %rax
int $0x80
rasak@515jzl:~/Programs$ as -o demo.o demo.s
rasak@515jzl:~/Programs$ ld -d demo.o -o demo
rasak@515jzl:~/Programs$ ./demo
rasak@515jzl:~/Programs$ echo $?
222
各類寄存器用途
耶魯x86匯編教程, 很不錯的教程, 很清晰.
文中提到, 大部分寄存器都沒有特殊用途, 除了rbp
和rsp
是用作棧的(64位系統(tǒng)). rip
指向當(dāng)前執(zhí)行的指令.
我們以一個簡單例子說明:
.section .text
.globl _start
_start:
push $3
push $5
pop %rax
pop %rbx
gdb調(diào)試一下, 先運行兩次nexti
, 也就是執(zhí)行兩次push
, 然后查看寄存器情況:
rip
指向當(dāng)前的指令, rsp
指向的位置保存了5. rbp
為0(為什么呢?)
gdb調(diào)試