x64 syscall 参数构造表
; nasm -f elf64 -g -F dwarf uppercaser2.asm
; ld -o uppercaser2 uppercaser2.o
; gdb uppercaser2; ./uppercaser2 > (输出文件) < (输入文件)
;./uppercaser2 > 2.txt <1.txtSECTION .bssBUFFLEN equ 1024Buff: resb BUFFLENSECTION .dataSECTION .textglobal _start_start:nop;x86_64 通过中断(syscall)指令来实现;寄存器 rax 中存放系统调用号,同时系统调用返回值也存放在 rax 中;当系统调用参数小于等于6个时,参数则必须按顺序放到寄存器 rdi,rsi,rdx,r10,r8,r9中;当系统调用参数大于6个时,全部参数应该依次放在一块连续的内存区域里,同时在寄存器 ebx 中保存指向该内存区域的指针;当进行函数调用时,参数少于7个, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。参数为7个以上时,前 6 个与前面一样, 但后面的依次从 "右向左" 放入栈中。read:mov rax, 0 ;sys_read 系统调用号mov rdi, 0 ; 文件描述符mov rsi, Buffmov rdx, BUFFLENsyscall mov rsi,raxcmp rax,0je Done; 设置寄存器mov rcx, rsimov rbp, Buffdec rbpScan:cmp byte [rbp+rcx],61h jb Nextcmp byte [rbp+rcx],7Ah ja NextSub byte [rbp+rcx],20h Next: dec rcxjnz ScanWrite:mov rax, 1 ;sys_read 系统调用号mov rdi, 1 ; 文件描述符mov rsi, Buffmov rdx, BUFFLENsyscalljmp readDone:mov rax, 60 ;sys_exit的系统调用编号为60xor rdi, rdisyscall