汇编实验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

效果

目录
相关文章
|
4天前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
142 77
|
1月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
38 7
|
1月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
44 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
46 9
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
3月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
72 0
|
3月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
55 1
|
3月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
116 21
|
3月前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。