汇编语言 | 输出斐波那契数列前50项

由于数比较大,要用到EAX等寄存器才不会溢出(其实最后四位数还是溢出的,没解决。。交作业时间比较急,没顾得上改,就这样吧)

DATAS SEGMENT
    ARRAY DWORD 50 dup(?)
	COUNT DWORD ?
	CHANGELINE DB 0AH,0DH,'$'
	MESS DB "TOP 50 fibonacci number is:",0ah,0dh,'$'
DATAS ENDS

STACKS SEGMENT
    WORD 1024 DUP(?)
    TOS LABEL WORD
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
 MAIN PROC FAR
 	.386
    MOV AX,DATAS
    MOV DS,EAX
  	MOV AX,STACKS
  	MOV SS,EAX
  	MOV SP,OFFSET TOS
	
	MOV ECX,45
	MOV ESI,OFFSET ARRAY
	MOV EAX,1;第一项
	MOV EBX,1;第二项
	MOV [ESI],EAX
	INC COUNT
	ADD ESI,TYPE ARRAY 
	MOV [ESI],EBX
	INC COUNT
	ADD ESI,TYPE ARRAY 

F:	ADD EAX,EBX;n-2项+n-1项
	MOV EDX,EAX;第n项

	MOV [ESI],EDX
	INC COUNT
	ADD ESI,TYPE ARRAY 
	MOV EAX,EBX
	MOV EBX,EDX
	LOOP F
	CALL PRINT
	MOV EAX,4C00H
	INT 21H
MAIN ENDP


PRINT PROC NEAR
	MOV EDX,OFFSET MESS
    MOV AH,09H
    INT 21H
	MOV ESI,OFFSET ARRAY
	MOV ECX,COUNT;做count次loop
H1:MOV EAX,COUNT
	SUB AX,CX ;每次cx减1 
	MOV BL,10
	DIV BL;被除数是AX
	CMP AH,0;余数在AH中
	JNZ AGAIN;余数不为0,即ax-cx不是10的倍数
	MOV DX,OFFSET CHANGELINE
    MOV AH,09H;是10的倍数,输出换行
    INT 21H
AGAIN:
	MOV EBX,[ESI]
	PUSH ECX;转十进制输出的acssi码要用cx,原cx入栈保留
	MOV ECX,0
D1: MOV EAX,EBX
	MOV EDX,0
	MOV EBX,10
	DIV EBX;32位,余数放DX中
	PUSH EDX
	INC ECX
	MOV EBX,EAX;商放AX
	CMP EAX,0
	JNZ D1
D2: POP EDX
	ADD EDX,30H
	MOV AH,2H
	INT 21H
	LOOP D2
	POP ECX
	ADD ESI,TYPE ARRAY
	MOV DL,00H
	MOV AH,2H
	INT 21H
L:	LOOP H1
	
RET
PRINT ENDP

CODES ENDS
    END START

欢迎批评指正。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是用 x86 汇编语言输出斐波那契数列20的代码: ``` section .data fib db 0, 1 ; 斐波那契数列 section .text global _start _start: ; 输出斐波那契数列的第一 mov eax, [fib] call print_num mov eax, 10 ; 换行符的 ASCII 码 call print_char ; 输出斐波那契数列的第二 mov eax, [fib + 1] call print_num mov eax, 10 ; 换行符的 ASCII 码 call print_char ; 输出斐波那契数列的剩余18 mov ecx, 18 ; 循环计数器 mov ebx, [fib] ; ebx 存储当的值 mov edx, [fib + 1] ; edx 存储下一的值 next_fib: add ebx, edx ; 计算下一的值 mov eax, ebx ; 将下一的值赋给 eax call print_num mov eax, 10 ; 换行符的 ASCII 码 call print_char ; 更新 fib 数组的值 mov [fib], edx mov [fib + 1], ebx loop next_fib ; 退出程序 mov eax, 1 xor ebx, ebx int 0x80 ; 输出一个数字 print_num: push eax ; 保存 eax 的值 push ebx ; 保存 ebx 的值 push ecx ; 保存 ecx 的值 mov ecx, 0 ; 将 ecx 置为 0,作为循环计数器 mov ebx, 10 ; ebx 存储 10,用于对数字进行除法和取模运算 .loop: xor edx, edx ; 将 edx 置为 0 div ebx ; edx 存储余数,eax 存储商 push edx ; 将余数压入栈中 inc ecx ; 循环计数器加 1 test eax, eax ; 如果 eax 等于 0,跳出循环 jnz .loop ; 从栈中弹出余数,输出数字 .print: pop eax ; 将余数存入 eax add eax, 48 ; 将数字的 ASCII 码加上 48 mov [num], al ; 将数字的 ASCII 码存入 num 变量 mov eax, 4 ; 系统调用编号为 4,表示输出字符串 mov ebx, 1 ; 文件描述符为 1,表示标准输出 mov ecx, num ; 字符串指针 mov edx, 1 ; 输出字符串长度为 1 int 0x80 ; 如果还有余数,继续输出数字 dec ecx ; 循环计数器减 1 jnz .print ; 恢复寄存器的值 pop ecx pop ebx pop eax ret ; 输出一个字符 print_char: mov [char], al ; 将字符存入 char 变量 mov eax, 4 ; 系统调用编号为 4,表示输出字符串 mov ebx, 1 ; 文件描述符为 1,表示标准输出 mov ecx, char ; 字符串指针 mov edx, 1 ; 输出字符串长度为 1 int 0x80 ret section .bss num resb 1 ; 存储数字的 ASCII 码 char resb 1 ; 存储字符的 ASCII 码 ``` 这段代码使用了 x86 的汇编语言,在 Linux 系统上运行。它使用了一个 fib 数组来存储斐波那契数列,然后使用循环计算并输出斐波那契数列的剩余18。在输出数字时,它采用了将数字转换为字符串的方法,然后输出字符串的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值