通过系统调用中断打印数字

一 打印数字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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值