汇编语言 子程序设计
2021/5/23 20:27:19
本文主要是介绍汇编语言 子程序设计,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.编写一个求n!的子程序,利用它求1!+2! +3! +4! +5! +6! +7! +8! 的和(=46233 )并输出。要求参数的传递分别采用:寄存器传递、全局变量传递,堆栈传递三种不同的方法实现。
代码
; 寄存器传参 include io32.inc .data sum dword 0 .code start: main proc mov ebx, 1 .while ebx <= 8 call fac add sum, eax inc ebx .endw mov eax, sum call dispuid call dispcrlf ret main endp fac proc mov ecx, 1 mov eax, 1 .while ecx <= ebx imul eax, ecx inc ecx .endw ret fac endp end main
截图
2. 编写一个判断闰年的子程序,利用它求出2010年到2060年之间所有的闰年并输出。建议采用堆栈传递参数。
代码
include io32.inc .data year dword ? flag dword ? .code main proc mov year, 2010 .while year <= 2060 call leap cmp flag, 1 jne next mov eax, year call dispuid call dispcrlf next: inc year .endw main endp leap proc mov flag, 0 mov eax, year xor edx, edx push eax push edx mov ebx, 400 div ebx .if !edx jmp lab1 .else pop edx pop eax mov ebx, 4 div ebx .if !edx mov eax, year xor edx, edx mov ebx, 100 div ebx .if edx jmp lab1 .else jmp lab2 .endif .else jmp lab2 .endif .endif lab1: mov flag, 1 lab2: ret leap endp end main
截图
3. 编程写一个名为Prime的子程序,用于测试一个整数是否是素数,主子程序间的参数传递通过堆栈完成。调用Prime子程序求出2~100之间的所有素数,并将它们存入Parray数组中,素数的个数存入变量Pcounter中。
代码
include io32.inc .data Parray dword 100 dup(0) flag dword ? .code main proc mov esi, offset Parray ; ESI 为指向 array 数组首地址的指针 mov ebx, 2 .while ebx <= 100 push ebx call Prime .if flag == 1 mov [esi], ebx add esi, 4 ; show1 mov eax, ebx call dispuid call dispcrlf .endif inc ebx .endw ; show2 ;mov ecx, lengthof Parray ;mov ebx, offset Parray ;again: ;mov eax, [ebx] ;.if eax == 0 ; ret ;.endif ;call dispuid ;call dispcrlf ;add ebx, 4 ;loop again ret main endp Prime proc push ebp mov ebp, esp ; 求素数的核心程序 mov ecx, 2 .while ecx < [ebp + 8] ;.if [ebp + 8] % ecx == 0 mov eax, [ebp + 8] mov edx, 0 div ecx .if edx == 0 mov flag, 0 jmp done .endif inc ecx .endw mov flag, 1 done: pop ebp ret 1 * 4 Prime endp end main
截图
4. 编程写一个名为Gcd的求两个数最大公约数子程序,主子程序间的参数传递通过堆栈完成。调用Gcd子程序求出三个双字变量:dvar1、dvar2与dvar3的最大公约数并输出。
代码
include vcIO.inc .data prompt byte '请输入三个整数(以空格分隔):', 0 fmt1 byte '%d %d %d', 0 fmt2 byte '最大公约数:%d', 13, 10, 13, 10, 0 dvar1 dword ? dvar2 dword ? dvar3 dword ? res dword ? .code main proc again: pushad invoke printf, offset prompt invoke scanf, offset fmt1, offset dvar1, offset dvar2, offset dvar3 popad push dvar1 push dvar2 call gcd ; 堆栈传参,结果保存在 EAX add esp, 8 push eax push dvar3 call gcd add esp, 8 mov res, eax pushad invoke printf, offset fmt2, res popad jmp again ret main endp gcd proc push ebp mov ebp, esp push ebx ; 保护寄存器 push edx mov eax, [ebp + 8] mov ebx, [ebp + 12] .if eax < ebx xchg eax, ebx .endif .while ebx != 0 xor edx, edx idiv ebx mov eax, edx xchg eax, ebx .endw pop edx pop ebx pop ebp ret gcd endp end main
截图
5. 编写一子程序,将一个32位二进制数用8位十六进制形式在屏幕上显示出来。采用堆栈方法传递这个32位二进制数,并写主程序验证它。显示一个字符的子程序为:dispc,入口参数:AL=要显示个字符的SACII码。
代码
include io32.inc .data msg1 byte '32位二进制:00110000011100101000000110101111B', 13, 10, 0 msg2 byte '8位十六进制:', 0 dvar dword 00110000011100101000000110101111B .code main proc mov eax, offset msg1 call dispmsg mov eax, offset msg2 call dispmsg push dvar call disp mov al, 'H' call dispc call dispcrlf ret main endp disp proc push ebp mov ebp, esp push ecx mov ecx, 8 mov eax, [ebp + 8] again: rol eax, 4 push eax and al, 0fh add al, 30h .if al > '9' add al, 7 .endif call dispc pop eax loop again pop ecx pop ebp ret 1 * 4 disp endp end main
截图
6. 编程写一个名为Bubble的冒泡排序子程序,主子程序间的参数传递通过堆栈完成;并写主程序验证它。
代码
; BubbleSort include vcIO.inc include io32.inc .data array dword 3, 2, -1, 3, 5 msg1 byte '原数组:', 0 msg2 byte '新数组:', 0 len dword lengthof array fmt byte '%d ', 0 .code main proc mov eax, offset msg1 call dispmsg call show call bubbleSort mov eax, offset msg2 call dispmsg call show ret main endp show proc push ebp mov ebp, esp push ebx pushad mov ebx, 0 .while ebx < len invoke printf, offset fmt, array[ebx * 4] inc ebx .endw popad call dispcrlf pop ebx pop ebp ret show endp bubbleSort proc push ebp mov ebp, esp push eax push ebx push esi push edi mov esi, 0 .while esi < len mov edi, esi inc edi mov eax, array[esi * 4] .while edi < len mov ebx, array[edi * 4] .if sdword ptr eax > sdword ptr ebx xchg eax, ebx mov dword ptr array[esi * 4], eax mov dword ptr array[edi * 4], ebx .endif inc edi .endw inc esi .endw pop edi pop esi pop ebx pop eax pop ebp ret bubbleSort endp end main
截图
看后点赞,好运不断
这篇关于汇编语言 子程序设计的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南