"Programming from the Ground Up" 第三章有一節 "Addressing Modes" (P.41),會描述各種定址方式的寫法,久沒寫組語,想要重頭溫習一定要來看這一節。
另外,就是 stack (第四章) 的傳遞,久沒碰真的會忘記,當然 x64 函數參數還會用到暫存器 (以 Windows 來說是前 4 個參數),剩下的才用 stack。
總之,記錄一下避免下次還要重頭回想。
"Programming from the Ground Up" 第三章有一節 "Addressing Modes" (P.41),會描述各種定址方式的寫法,久沒寫組語,想要重頭溫習一定要來看這一節。
另外,就是 stack (第四章) 的傳遞,久沒碰真的會忘記,當然 x64 函數參數還會用到暫存器 (以 Windows 來說是前 4 個參數),剩下的才用 stack。
總之,記錄一下避免下次還要重頭回想。
正在產生程式碼 已完成程式碼產生 UefiApplicationEntryPoint.lib(ApplicationEntryPoint.obj) : error LNK2001: 無法解析的外部符號 __chkstk
| "as -gstabs | add debug information to object |
| "objdump -D a.out | less" or "nm a.out" | 利用此步驟找到相關變數或 label 的 address |
| "gdb a.out" | 執行 GDB |
| "b label name" | 對要監控的 label 下斷點 |
| "display /i $pc" | 顯示當前執行的組語 |
| "run" | 執行程式 |
| 斷點觸發 | |
| "info all-registers" | 觀看目前所有暫存器值 |
| "p $eax" | 觀看 eax |
| "p abc" | 觀看 variable abc |
| "x/x address" | 觀看 address hex value |
| "step" | 單步執行 |
.type myprint,@function
myprint:
pushl %ebp
movl %esp, %ebp
# get msg address
movl 8(%ebp), %ecx
# get msg length
movl $0, %edx
start_loop:
cmpb $0, (%ecx)
je end_loop
incl %ecx
incl %edx
jmp start_loop
end_loop:
movl $4, %eax
movl $1, %ebx
movl 8(%ebp), %ecx
int $0x80
movl %ebp, %esp
popl %ebp
ret
.section .data
name:
.string "MK"
.section .text
.global _start
_start:
movl $39, %eax
movl $name, %ebx
movl $0777, %ecx
int $0x80
movl $1, %eax
movl $0, %ebx
int $0x80
start_loop:
incl %edi
movl $4, %edx
imull %edi, %edx
addl %ebx, %edx
start_loop:
addl $4, %ebx
as source.s --32 -o source.o ld source.o -m elf_i386 -o source.out
.section .data
list:
.long 31,2,199,7,0
.section .text
.global _start
_start:
pushl $list
call max
addl $4, %esp
movl %eax, %ebx
movl $1, %eax
int $0x80
.type max,@function
max:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %ebx
movl $0, %edi
movl $4, %edx
imull %edi, %edx
addl %ebx, %edx
movl (%edx), %eax
start_loop:
incl %edi
movl $4, %edx
imull %edi, %edx
addl %ebx, %edx
movl (%edx), %ecx
cmpl $0, %ecx
je end_loop
cmpl %eax, %ecx
jle start_loop
movl %ecx, %eax
jmp start_loop
end_loop:
movl %ebp, %esp
popl %ebp
ret