热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

汇编语言子程序设计

1.编写一个求n!的子程序,利用它求1!+2!+3!+4!+5!+6!+7!+8!的和(46233)并输出。要求参数的传递分别采用:寄存器传递、全局变量传递,堆栈传递三种不同的方法




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 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 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 mov edi, esi
inc edi
mov eax, array[esi * 4]
.while edi 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

截图

在这里插入图片描述

看后点赞,好运不断



推荐阅读
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
author-avatar
kyle_G_476
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有