汇编实验4(99乘法表,整数分解,素数环,迷宫问题)【栈传参,递归,寻址方式】

简介: 汇编实验4(99乘法表,整数分解,素数环,迷宫问题)【栈传参,递归,寻址方式】

一、99乘法表

汇编代码

1. INCLUDE Irvine32.inc
2. .data
3. a db '*',0
4. .code
5. main PROC
6. mov ebx,1;ebx=i
7. mov ecx,1;ecx=j
8. l0:
9. cmp ebx,9
10. ja final
11. mov ecx,1
12. l2:
13. cmp ecx,ebx
14. ja l1
15. mov eax,ebx
16. call writedec
17. mov al,a
18. call writechar
19. mov eax,ecx
20. call writedec
21. mov al,' '
22. call writechar
23. call writechar
24. inc ecx
25. jmp l2
26. l1:
27. call crlf
28. inc ebx
29. jmp l0
30. final:
31.    exit
32. main ENDP
33. end main
34. 
35. #include <stdio.h>
36. int main(){
37.     int i,j;
38. for(i=1;i<=9;i++)
39.     {
40. for(j=1;j<=i;j++)
41.             {printf("%d*%d=%2d  ",i,j,i*j);}
42.         printf("\n");
43.     }
44. 
45. return 0;
46. }

效果

貌似有点问题,忘了把运算结果加上......

二、整数拆分

问题描述

问题描述

输入一个N,输出所有拆分的方式。

如input: 3

output:

1+1+1

1+2

3

算法思想

用一个数组res[]存放拆分的解,用全局变量存放拆分的方法数。

divN(n,k)使用n表示要分解的整数,k表示res数组下标,即第k次拆分。

先从divN(n,1)开始,用num表示第k个拆分的数,即res[k]=num,

让num在[1,n]内遍历。用rest=n-num表示拆分后剩下的整数值。若rest等于零,

代表本次拆分结束,输出拆分解。否则处理第k+1个数组元素,即divN(rest,k+1),

依次类推,直到rest为0输出结果。

c代码

1. #include "stdafx.h"
2. #include<stdio.h>
3. #include<stdlib.h>
4. int res[10000] = { 0 }; //res数组存放解
5. int times = 0; //times计算拆分的次数
6. void divN(int n, int k) { //n是需要拆分的整数,k是指res数组的下标
7. int rest; //存放拆分后剩余的整数
8. for (int num = 1;num <= n; num++) {  //从1开始尝试拆分
9. if (num >= res[k - 1] ) { //拆分的解要大于或等于前一个解保证不重复
10.             res[k] = num; //将这次拆分存放在res数组中
11.             rest = n - num; //剩下的是n-num
12. if (rest == 0) { //如果没有剩下的,说明本次拆分结束
13.                 times++;  //拆分次数加1
14.     printf("%3d:", times);
15. for (int j = 1; j < k; j++) {  //输出解
16. printf("%d+", res[j]);
17.                 }
18. printf("%d\n", res[k]);
19.             }
20. else divN(rest, k + 1);  //如果有剩下的,继续求出res[k+1]
21.         }
22.     }
23. }
24. int main() {
25. int n;
26. printf("Please enter a integer N:");
27. scanf_s("%d", &n);
28. divN(n, 1);
29. printf("there are %d ways to divide the integer %d.", times,n);
30. system("pause");
31. return 0;
32. }

汇编代码

1. INCLUDE Irvine32.inc
2. .data
3. res dd 10000 dup(0)
4. times dd 0
5. n dd ?
6. st1 db 'Please enter a integer N:',0
7. .code
8. main PROC
9. mov edx,offset st1
10. call writestring
11. call readint
12. mov n,eax
13. push n
14. push 1
15. call divN
16. exit
17. main ENDP
18. 
19. divN PROC
20. push ebp
21. mov ebp,esp
22. pushad
23. mov ecx,[ebp+8];ecx=k
24. mov edx,[ebp+12];edx=n
25.                ;edi=rest
26. mov ebx,1;ebx=num
27. l0:;for
28. cmp ebx,edx
29. ja final
30. mov eax,ebx;eax=ebx
31. cmp eax,res[4*ecx-4]
32. jl l1
33. mov res[4*ecx],eax
34. mov eax,edx
35. sub eax,ebx;eax=n-ebx
36. mov edi,eax
37. cmp edi,0
38. jnz l2
39. inc times
40. mov eax,times
41. call writedec
42. mov al,' '
43. call writechar
44. mov esi,1;esi=j
45. l3:;for
46. cmp esi,ecx
47. jae l4
48. mov eax,res[+4*esi]
49. call writedec
50. mov al,'+'
51. call writechar
52. inc esi
53. jmp l3
54. l4:
55. mov eax,res[4*ecx]
56. call writedec
57. call crlf
58. jmp l1
59. l2:;else
60. push edi
61. mov eax,ecx
62. inc eax;eax=k+1
63. push eax
64. call divN
65. l1:
66. inc ebx
67. jmp l0
68. final:
69. popad
70. pop ebp
71. ret 8
72. divN ENDP
73. END main

效果

 

三、素数环

问题描述

素数环

题目:输入正整数n,把整数1,2,3,...,n组成一个环。

使得相邻两个整数之和均为素数。

输出时从整数1開始逆时针排列。

同一个环应该恰好输出一次。

c代码

1. #include<iostream>
2. #include<cstdio>
3. #include<cstring>
4. using namespace std;
5. 
6. const int maxn =1000;
7. int vis[maxn];
8. int A[maxn];
9. int isp[maxn];
10. int n;
11. int ans=0;
12. 
13. int is_prime(int x){
14. for( int i=2; i*i<=x; i++ ){
15. if(x%i==0) return 0;
16.     }
17. return 1;
18. }
19. 
20. void dfs(int cur){
21. if(cur==n&&isp[A[0]+A[n-1]]){
22.         ans++;
23. for( int i=0; i<n; i++ ) cout<<A[i]<<" ";
24.         cout<<endl;
25.     }
26. else{
27. for(int i=2; i<=n; i++ ){
28. if(!vis[i]&&isp[i+A[cur-1]]){
29.          /*i这个数没被用过,并且符合前后两个数相加为素数的要求*/
30.                 A[cur]=i;/*采用这个数*/
31.                 vis[i]=1;/*设置使用标志*/
32. dfs(cur+1);
33.                 vis[i]=0;/*消除标志*//*回溯的本质*/
34.             }
35.         }
36.     }
37. }
38. 
39. int main(int argc, char const *argv[])
40. {
41.     cin>>n;
42. memset(vis,0,sizeof(vis));
43. for( int i=2; i<=n*2; i++ ) isp[i]=is_prime(i);
44.     A[0]=1;/*题目中规定从1开始*/
45. dfs(1);
46.     cout<<ans<<endl;
47. 
48. return 0;
49. }

汇编代码

1. INCLUDE Irvine32.inc
2. .data
3. ans dd 0
4. vis dd 1000 dup(0)
5. A dd 1000 dup(?)
6. isp dd 1000 dup(?)
7. n dd ?
8. .code
9. main PROC
10. mov ecx,offset A
11. mov eax,1
12. mov [ecx],eax
13. mov eax,0
14. call readint
15. mov n,eax
16. mov ebx,2;ebx=i
17. l0:
18. mov eax,n
19. add eax,eax;eax=2*n
20. cmp ebx,eax
21. ja l1
22. push ebx
23. call is_prime
24. mov ecx,offset isp;ecx=isp
25. mov [ecx+4*ebx],eax
26. inc ebx
27. jmp l0
28. l1:
29. push 1
30. call dfs
31. mov eax,ans
32. call writedec
33. call crlf
34. exit
35. main ENDP
36. 
37. is_prime PROC
38. push ebp
39. mov ebp,esp
40. sub esp,4
41. pushad
42. mov ebx,[ebp+8];ebx=x
43. mov ecx,2;ecx=i
44. mov eax,0
45. mov [ebp-4],eax
46. l0:
47. mov eax,ecx
48. mul ecx
49. cmp eax,ebx
50. ja final1
51. mov edx,0
52. mov eax,ebx
53. div ecx
54. cmp edx,0
55. je final2
56. inc ecx
57. jmp l0
58. final1:
59. mov eax,1
60. mov [ebp-4],eax
61. final2:
62. popad
63. mov eax,[ebp-4]
64. add esp,4
65. pop ebp
66. ret 4
67. is_prime ENDP
68. 
69. dfs PROC
70. push ebp
71. mov ebp,esp
72. pushad
73. mov ebx,[ebp+8];ebx=cur
74. mov ecx,offset A;ecx=A
75. mov esi,offset isp;esi=isp
76. mov edi,offset vis;edi=vis
77. cmp ebx,n
78. jne l0
79. mov eax,[ecx]
80. mov esi,n
81. add eax,[ecx+esi*4-4];eax=A[0]+A[n-1]
82. mov esi,offset isp;esi=isp
83. mov eax,[esi+eax*4];eax=isp[A[0]+A[n-1]]
84. cmp eax,1
85. jne l0
86. inc ans
87. mov edx,0;edx=i
88. l1:
89. cmp edx,n
90. jae l2
91. mov eax,[ecx+edx*4]
92. call writedec
93. mov al,' '
94. call writechar
95. inc edx
96. jmp l1
97. l2:
98. call crlf
99. jmp final
100. 
101. l0: ;else
102. mov edx,2;edx=i
103. l3: ;for
104. cmp edx,n
105. ja final
106. mov eax,1
107. cmp [edi+4*edx],eax
108. je l4
109. mov eax,ebx
110. dec eax;eax=cur-1
111. mov eax,[ecx+4*eax]
112. add eax,edx
113. mov eax,[esi+4*eax]
114. cmp eax,1
115. jne l4
116. mov [ecx+ebx*4],edx
117. mov eax,1
118. mov [edi+edx*4],eax
119. mov eax,ebx
120. inc eax;eax=cur+1
121. push eax
122. call dfs
123. mov eax,0
124. mov [edi+4*edx],eax
125. l4:
126. inc edx
127. jmp l3
128. final:
129. popad
130. pop ebp
131. ret 4
132. dfs ENDP
133. END main

效果

四、迷宫问题

问题描述

有一个 7 x 7 的迷宫,起点是'S',终点是'E',墙是'o',道路是空格。

请找出从起点到终点的通路,通路用符号'.'表示。

用二维数组表示迷宫场景。其中用2代表迷宫的墙壁,0代表可行通道。

走的路径记作1,也就是数组中的0被改为1

c代码

1. #include <stdio.h>
2. #include <stdlib.h>
3. #define M 9
4. //把7*7迷宫加大成9*9格局
5. int maze[M][M] ={
6.         {2,2,2,2,2,2,2,2,2},
7.         {2,0,0,0,0,0,0,0,2},
8.         {2,0,2,2,0,2,2,0,2},
9.         {2,0,2,0,0,2,0,0,2},
10.         {2,0,2,0,2,0,2,0,2},
11.         {2,0,0,0,0,0,2,0,2},
12.         {2,2,0,2,2,0,2,2,2},
13.         {2,0,0,0,0,0,0,0,2},
14.         {2,2,2,2,2,2,2,2,2}
15. };
16. 
17. int start1=1,start2=1;          //假定[1][1]是入口
18. int end1=7,  end2=7;            //假定[7][7]是出口
19. 
20. void visit(int i,int j){
21. int m,n;
22.   maze[i][j] = 1;
23. if(i==end1 && j==end2) { //判断是否到达出口位置,到达直接输出
24. printf("\n显示路径:\n");
25. for(m=0;m<M;m++){
26. for(n=0;n<M;n++){
27. if(maze[m][n] == 2)  printf("o");
28. else if(maze[m][n] == 1)  printf(".");
29. else     printf(" ");           
30.                   }
31. printf("\n");
32.               }//end for
33.    }//end if
34. 
35. //不再判定是否到达出口,只分析老鼠可以在迷宫移动的方向,
36.   //并递归求下一步.
37. if(maze[i][j+1] == 0)    visit(i,j+1);
38. if(maze[i+1][j] == 0)    visit(i+1,j);
39. if(maze[i][j-1] == 0)    visit(i,j-1);
40. if(maze[i-1][j] == 0)    visit(i-1,j);
41.   //若代码运行到这一步,则证明前面走的路径并不能到达出口,
42.   //则返回,把走过的位置重新写作0
43.         maze[i][j] = 0;
44. }
45. 
46. int main (){
47. int i,j;
48. printf("显示迷宫:\n");
49. for(i=0;i<M;i++)   {  /对摆放的数组迷宫进行打印
50. for(j=0;j<M;j++)
51. if(maze[i][j] == 2)   printf("o");
52. else    printf(" ");
53. printf("\n");
54.        }
55. visit(start1,start2);  //直接调用visit函数,把输出内容放在visit函数中,
56.   //好让所有路径进行遍历
57. 
58. return 0;
59. }

汇编代码

INCLUDE Irvine32.inc

.data

ar dd 2,2,2,2,2,2,2,2,2

  dd 2,0,0,0,0,0,0,0,2

  dd 2,0,2,2,0,2,2,0,2

  dd 2,0,2,0,0,2,0,0,2

  dd 2,0,2,0,2,0,2,0,2

  dd 2,0,0,0,0,0,2,0,2

  dd 2,2,0,2,2,0,2,2,2

  dd 2,0,0,0,0,0,0,0,2

  dd 2,2,2,2,2,2,2,2,2

st1 db '显示迷宫:',0

M dd 9

num dd 36

start1 dd 1

start2 dd 1

end1 dd 7

end2 dd 7

.code

main PROC

mov ebx,0;ebx=i

l0:

cmp ebx,M

jae l1

mov ecx,0;ecx=j

l3:

cmp ecx,M

jae l2

push ecx

push ebx

call find

cmp eax,2

jnz l4

mov al,'o'

call writechar

jmp l5

l4:;else

mov al,' '

call writechar

l5:

inc ecx

jmp l3

l2:

call crlf

inc ebx

jmp l0

l1:

push start1

push start2

call visit

final:

  exit

main ENDP

visit PROC

;push i,push j

push ebp

mov ebp,esp

pushad

mov ebx,[ebp+8] ;ebx=j

mov ecx,[ebp+12];ecx=i

               ;edx=m

               ;esi=n

push 1

push ebx

push ecx

call wri

cmp ecx,end1

jne l0

cmp ebx,end2

jne l0

mov edx,0

l1:;for

cmp edx,M

jae l0

mov esi,0

l3:;for2

cmp esi,M

jae l2

push esi

push edx

call find

cmp eax,2

jnz l5

mov al,'o'

call writechar

jmp l4

l5:

cmp eax,1

jnz l6

mov al,'.'

call writechar

jmp l4

l6:

mov al,' '

call writechar

l4:

inc esi

jmp l3

l2:

call crlf

inc edx

jmp l1

l0:;end if

mov eax,ebx

inc eax

push eax

push ecx

call find

cmp eax,0

jne f1

mov eax,ebx

inc eax

push ecx

push eax

call visit

f1:

push ebx

mov eax,ecx

inc eax

push eax

call find

cmp eax,0

jne f2

mov eax,ecx

inc eax

push eax

push ebx

call visit

f2:

mov eax,ebx

dec eax

push eax

push ecx

call find

cmp eax,0

jne f3

mov eax,ebx

dec eax

push ecx

push eax

call visit

f3:

push ebx

mov eax,ecx

dec eax

push eax

call find

cmp eax,0

jne f4

mov eax,ecx

dec eax

push eax

push ebx

call visit

f4:

push 0

push ebx

push ecx

call wri

final:

popad

pop ebp

ret 8

visit ENDP

find PROC

;ar[i][j]

;push j,push i

push ebp

mov ebp,esp

sub esp,4

pushad

mov ebx,[ebp+8];ebx=i

mov ecx,[ebp+12];ecx=j

mov eax,ebx

mul num

mov eax,ar[eax+ecx*4]

mov [ebp-4],eax

popad

mov eax,[ebp-4]

add esp,4

pop ebp

ret 8

find ENDP

wri PROC

;n,ar[i][j]

;push n,push j,push i

push ebp

mov ebp,esp

pushad

mov ebx,[ebp+8];ebx=i

mov ecx,[ebp+12];ecx=j

mov edi,[ebp+16];edi=n

mov eax,ebx

mul num

mov ar[eax+ecx*4],edi

popad

pop ebp

ret 12

wri ENDP

END main

效果

目录
相关文章
|
22天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
104 9
|
12天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
21 1
|
15天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
18天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
20天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
47 4
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
33 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
24天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
初步认识栈和队列
初步认识栈和队列
61 10
|
1月前
数据结构(栈与列队)
数据结构(栈与列队)
20 1
|
1月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
48 3