一 打印数字0..10
打印核心汇编调用代码
mov rdx, rax;//strlen info rdx rdx存储字符串长度
pop rax;str base address
mov rcx, rax;str base addr into rcx rcx存储字符串首地址
mov rbx, 1;stdout rbx存储文件描述符
mov rax, 4; write rax存储系统调用编号
int 80h;syscall interrupt 系统调用中断
二 完整汇编代码
iprint:
push rax
push rcx
push rdx
push rsi
mov rcx, 0;count how many bytes tobe print
divideLoop:
inc rcx;count each byte to print - number of characters 统计字符个数
mov rdx, 0;empty rdx rdx清零
mov rsi, 10;mov 10 into rsi 整数要得到余数,每次打出来余数
idiv rsi; divid rax by rsi 得到余数,存放在rdx中
add rdx, 48; left value will be saved into rdx 余数转换成字符
push rdx;push the string into stack 余数存起来,入栈。rsp就是字符串的首地址
cmp rax, 0; 比较是否为0
jnz divideLoop; jmp if not zero 继续除
printLoop:
dec rcx;count down each byte we need to print
mov rax, rsp;mov the stack for rax to print 一个个字符打的,刚才上面,8字节一起入栈的,不是连续的字符串,所以,这里一个个字节打印。
call sprint;调用打印函数
pop rax;弹出来一个字符
cmp rcx, 0
jnz printLoop; 继续打印
pop rsi
pop rdx
pop rcx
pop rax
ret
iprintLF:
call iprint
push rax
mov rax, 0Ah
push rax; push 0Ah into stack
mov rax, rsp; print stack
call sprint
pop rax
pop rax
ret
slen:
push rbx
mov rbx, rax
nextchar:
cmp byte[rax], 0
jz finished
inc rax
jmp nextchar
finished:
sub rax, rbx
pop rbx
ret
sprint:
push rdx
push rcx
push rbx
push rax
call slen
mov rdx, rax
pop rax
mov rcx, rax
mov rbx, 1
mov rax, 4
int 80h
pop rbx
pop rcx
pop rdx
ret
sprintLF:
call sprint;//打印完字符串,
push rax
mov rax, 0aH;打印一个换行
push rax
mov rax, rsp
call sprint
pop rax
pop rax
ret
quit:
mov rbx, 0
mov rax, 1
int 80h
ret
;应用上面的代码
%include "functions.asm"
SECTION .text
global main
msg:
db "fantasy", 10, 0
main:
mov rcx, 0
nextNumber:
inc rcx
mov rax, rcx
call sprintLF
cmp rcx, 10
jne nextNumber
call quit
三 打印输出:
1
2
3
4
5
6
7
8
9
10