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

这篇具有很好参考价值的文章主要介绍了汇编实验4(99乘法表,整数分解,素数环,迷宫问题)【栈传参,递归,寻址方式】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、99乘法表

汇编代码

效果

二、整数拆分

问题描述

c代码

汇编代码

效果

三、素数环

问题描述

c代码

效果

四、迷宫问题

问题描述

c代码

汇编代码

效果


一、99乘法表

汇编代码

INCLUDE Irvine32.inc
.data
a db '*',0
.code
main PROC
mov ebx,1;ebx=i
mov ecx,1;ecx=j
l0:
cmp ebx,9
ja final
mov ecx,1
l2:
cmp ecx,ebx
ja l1
mov eax,ebx
call writedec
mov al,a
call writechar
mov eax,ecx
call writedec
mov al,' '
call writechar
call writechar
inc ecx
jmp l2
l1:
call crlf
inc ebx
jmp l0
final:
	 exit
main ENDP
end main

#include <stdio.h>
int main(){
    int i,j;
    for(i=1;i<=9;i++)
    {
        for(j=1;j<=i;j++)
            {printf("%d*%d=%2d  ",i,j,i*j);}
        printf("\n");
    }

    return 0;
}

效果

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

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

二、整数拆分

问题描述

问题描述
输入一个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代码

#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
int res[10000] = { 0 }; //res数组存放解
int times = 0; //times计算拆分的次数
void divN(int n, int k) { //n是需要拆分的整数,k是指res数组的下标
    int rest; //存放拆分后剩余的整数
    for (int num = 1;num <= n; num++) {  //从1开始尝试拆分
         if (num >= res[k - 1] ) { //拆分的解要大于或等于前一个解保证不重复
            res[k] = num; //将这次拆分存放在res数组中
            rest = n - num; //剩下的是n-num
            if (rest == 0) { //如果没有剩下的,说明本次拆分结束
                times++;  //拆分次数加1
		printf("%3d:", times);
                for (int j = 1; j < k; j++) {  //输出解
                    printf("%d+", res[j]);
                }
                printf("%d\n", res[k]);
            }
            else divN(rest, k + 1);  //如果有剩下的,继续求出res[k+1]
        }
    }
}
int main() {
    int n;
    printf("Please enter a integer N:");
    scanf_s("%d", &n);
    divN(n, 1);
    printf("there are %d ways to divide the integer %d.", times,n);
    system("pause");
    return 0;
}

汇编代码

INCLUDE Irvine32.inc
.data
res dd 10000 dup(0)
times dd 0
n dd ?
st1 db 'Please enter a integer N:',0
.code
main PROC
mov edx,offset st1
call writestring
call readint
mov n,eax
push n
push 1
call divN
exit
main ENDP

divN PROC
push ebp
mov ebp,esp
pushad
mov ecx,[ebp+8];ecx=k
mov edx,[ebp+12];edx=n
               ;edi=rest
mov ebx,1;ebx=num
l0:;for
cmp ebx,edx
ja final
mov eax,ebx;eax=ebx
cmp eax,res[4*ecx-4]
jl l1
mov res[4*ecx],eax
mov eax,edx
sub eax,ebx;eax=n-ebx
mov edi,eax
cmp edi,0
jnz l2
inc times
mov eax,times
call writedec
mov al,' '
call writechar
mov esi,1;esi=j
l3:;for
cmp esi,ecx
jae l4
mov eax,res[+4*esi]
call writedec
mov al,'+'
call writechar
inc esi
jmp l3
l4:
mov eax,res[4*ecx]
call writedec
call crlf
jmp l1
l2:;else
push edi
mov eax,ecx
inc eax;eax=k+1
push eax
call divN
l1:
inc ebx
jmp l0
final:
popad
pop ebp
ret 8
divN ENDP
END main

效果

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

 

三、素数环

问题描述

素数环

题目:输入正整数n,把整数1,2,3,...,n组成一个环。
使得相邻两个整数之和均为素数。

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

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

c代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn =1000;
int vis[maxn];
int A[maxn];
int isp[maxn];
int n;
int ans=0;

int is_prime(int x){
    for( int i=2; i*i<=x; i++ ){
        if(x%i==0) return 0;
    }
    return 1;
}

void dfs(int cur){
    if(cur==n&&isp[A[0]+A[n-1]]){
        ans++;
        for( int i=0; i<n; i++ ) cout<<A[i]<<" ";
        cout<<endl;
    }
    else{
        for(int i=2; i<=n; i++ ){
            if(!vis[i]&&isp[i+A[cur-1]]){
	       /*i这个数没被用过,并且符合前后两个数相加为素数的要求*/
                A[cur]=i;/*采用这个数*/
                vis[i]=1;/*设置使用标志*/
                dfs(cur+1);
                vis[i]=0;/*消除标志*//*回溯的本质*/
            }
        }
    }
}

int main(int argc, char const *argv[])
{
    cin>>n;
    memset(vis,0,sizeof(vis));
    for( int i=2; i<=n*2; i++ ) isp[i]=is_prime(i);
    A[0]=1;/*题目中规定从1开始*/
    dfs(1);
    cout<<ans<<endl;

    return 0;
}

汇编代码

INCLUDE Irvine32.inc
.data
ans dd 0
vis dd 1000 dup(0)
A dd 1000 dup(?)
isp dd 1000 dup(?)
n dd ?
.code
main PROC
mov ecx,offset A
mov eax,1
mov [ecx],eax
mov eax,0
call readint
mov n,eax
mov ebx,2;ebx=i
l0:
mov eax,n
add eax,eax;eax=2*n
cmp ebx,eax
ja l1
push ebx
call is_prime
mov ecx,offset isp;ecx=isp
mov [ecx+4*ebx],eax
inc ebx
jmp l0
l1:
push 1
call dfs
mov eax,ans
call writedec
call crlf
exit
main ENDP

is_prime PROC
push ebp
mov ebp,esp
sub esp,4
pushad
mov ebx,[ebp+8];ebx=x
mov ecx,2;ecx=i
mov eax,0
mov [ebp-4],eax
l0:
mov eax,ecx
mul ecx
cmp eax,ebx
ja final1
mov edx,0
mov eax,ebx
div ecx
cmp edx,0
je final2
inc ecx
jmp l0
final1:
mov eax,1
mov [ebp-4],eax
final2:
popad
mov eax,[ebp-4]
add esp,4
pop ebp
ret 4
is_prime ENDP

dfs PROC
push ebp
mov ebp,esp
pushad
mov ebx,[ebp+8];ebx=cur
mov ecx,offset A;ecx=A
mov esi,offset isp;esi=isp
mov edi,offset vis;edi=vis
cmp ebx,n
jne l0
mov eax,[ecx]
mov esi,n
add eax,[ecx+esi*4-4];eax=A[0]+A[n-1]
mov esi,offset isp;esi=isp
mov eax,[esi+eax*4];eax=isp[A[0]+A[n-1]]
cmp eax,1
jne l0
inc ans
mov edx,0;edx=i
l1:
cmp edx,n
jae l2
mov eax,[ecx+edx*4]
call writedec
mov al,' '
call writechar
inc edx
jmp l1
l2:
call crlf
jmp final

l0: ;else
mov edx,2;edx=i
l3: ;for
cmp edx,n
ja final
mov eax,1
cmp [edi+4*edx],eax
je l4
mov eax,ebx
dec eax;eax=cur-1
mov eax,[ecx+4*eax]
add eax,edx
mov eax,[esi+4*eax]
cmp eax,1
jne l4
mov [ecx+ebx*4],edx
mov eax,1
mov [edi+edx*4],eax
mov eax,ebx
inc eax;eax=cur+1
push eax
call dfs
mov eax,0
mov [edi+4*edx],eax
l4:
inc edx
jmp l3
final:
popad
pop ebp
ret 4
dfs ENDP
END main

效果

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

四、迷宫问题

问题描述

有一个 7 x 7 的迷宫,起点是'S',终点是'E',墙是'o',道路是空格。
请找出从起点到终点的通路,通路用符号'.'表示。


用二维数组表示迷宫场景。其中用2代表迷宫的墙壁,0代表可行通道。
走的路径记作1,也就是数组中的0被改为1

c代码

#include <stdio.h>
#include <stdlib.h>
#define M 9
//把7*7迷宫加大成9*9格局
int maze[M][M] ={
        {2,2,2,2,2,2,2,2,2},
        {2,0,0,0,0,0,0,0,2},
        {2,0,2,2,0,2,2,0,2},
        {2,0,2,0,0,2,0,0,2},
        {2,0,2,0,2,0,2,0,2},
        {2,0,0,0,0,0,2,0,2},
        {2,2,0,2,2,0,2,2,2},
        {2,0,0,0,0,0,0,0,2},
        {2,2,2,2,2,2,2,2,2}
};

int start1=1,start2=1;          //假定[1][1]是入口
int end1=7,  end2=7;            //假定[7][7]是出口

void visit(int i,int j){
        int m,n;
	maze[i][j] = 1;
        if(i==end1 && j==end2) { //判断是否到达出口位置,到达直接输出
             printf("\n显示路径:\n");
             for(m=0;m<M;m++){
                 for(n=0;n<M;n++){
                     if(maze[m][n] == 2)  printf("o");
                     else if(maze[m][n] == 1)  printf(".");
                     else     printf(" ");						
                  }
                  printf("\n");
              }//end for
	 }//end if

        //不再判定是否到达出口,只分析老鼠可以在迷宫移动的方向,
	//并递归求下一步.
        if(maze[i][j+1] == 0)    visit(i,j+1);
        if(maze[i+1][j] == 0)    visit(i+1,j);
        if(maze[i][j-1] == 0)    visit(i,j-1);
        if(maze[i-1][j] == 0)    visit(i-1,j);
	//若代码运行到这一步,则证明前面走的路径并不能到达出口,
	//则返回,把走过的位置重新写作0
        maze[i][j] = 0;
}

int main (){
       int i,j;
       printf("显示迷宫:\n");
       for(i=0;i<M;i++)   {  /对摆放的数组迷宫进行打印
           for(j=0;j<M;j++)
              if(maze[i][j] == 2)   printf("o");
              else    printf(" ");
              printf("\n");
       }
       visit(start1,start2);  //直接调用visit函数,把输出内容放在visit函数中,
	//好让所有路径进行遍历

       return 0;
}

汇编代码

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(99乘法表,整数分解,素数环,迷宫问题)【栈传参,递归,寻址方式】文章来源地址https://www.toymoban.com/news/detail-406379.html

到了这里,关于汇编实验4(99乘法表,整数分解,素数环,迷宫问题)【栈传参,递归,寻址方式】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言——九九乘法表

      当对这段代码进行分块分析时,可以将其分为以下几个部分: 第一部分: 这部分代码包含了头文件 stdio.h 的引入以及 main() 函数的定义。其中定义了三个整型变量 i 、 j 和 result ,用于循环和存储乘积结果。 printf(\\\"n\\\") 用于打印一个换行符。 第二部分: 这部分代码使用嵌套

    2024年02月13日
    浏览(38)
  • js实现九九乘法表

    效果图 代码 快去试一试吧

    2024年01月21日
    浏览(37)
  • Scala编写九九乘法表

    一、idea里面new一个Scala Class,点击Object,输入名称,创建即可 注意:编写scala之前要下载scala,并添加scala框架支持,才可以编写scala 二、得出结果  这就是用scala方法编写的九九乘法表

    2024年02月13日
    浏览(34)
  • Python实现九九乘法表

    九九乘法表有四种展现形式 1.左下三角形 : 方法1:for...for循环实现 详解方法1的实现过程: for循环用于遍历,遍历几次输出几次 range():取范围值,取头不取尾,range(1,10)代表取数字1-9 打印输出第一行数据:1*=1 step1:第一行代码得到i=1,然后跳到第二行代码 step2:此时第二

    2023年04月23日
    浏览(76)
  • Python 编写九九乘法表详解

    九九乘法表是一种经典的数学表格,用于展示数字 1 到 9 的乘法结果。它不仅有助于学生学习乘法,还是编写 Python 程序的绝佳练习。在本文中,将详细介绍如何使用 Python 编写九九乘法表,并提供丰富的示例代码。 九九乘法表是一个 9x9 的表格,其中包含了数字 1 到 9 的所有

    2024年01月25日
    浏览(40)
  • Java如何打印九九乘法表

    要打印九九乘法表,可以借助双重循环先看整体,有9行,所以就先用一个for循环,for(i=1;i=9;i++); 再将每一个看作一个整体,第一行打印一个,第二行打印两个,第i行打印i个,所以再用一个循环,for(j=1;j=i;j++), 最后打印System.out.printf(\\\"%-2d * % -2d = %-3d\\\" ,j, i, j*i); 特别注意:

    2024年02月06日
    浏览(33)
  • 用Java打印九九乘法表

    1、因为九九乘法表是九行九列的,所以,我们选择用循环来完成九九乘法表的打印 2、第一个知识点:在for循环的嵌套中(外层循环控制行数,内层循环控制列数) 所以我们就有了一个简单的框架: 现在这个框架里面有两个空的循环,没有初始值,控制条件,判断条件,也

    2024年02月08日
    浏览(48)
  • c语言—九九乘法表(五种形式)

    九九乘法表共 9 行 9 列,重点考察 for 循环的掌握情况。 下面给出了输出完整乘法表、右上、右下、左上、左下乘法表的代码。 【代码一】输出完整的三角形: 运行结果: 【代码二】输出右上三角形和左上三角形: 运行结果: 去掉八个空格后的运行结果: 【代码三】输出

    2024年02月04日
    浏览(34)
  • 利用python来打印九九乘法表

    结果

    2024年02月07日
    浏览(42)
  • Java实现九九乘法表(详解版)

    (一)这是程序的入口方法,是Java程序的必需部分,其作用是定义了程序的执行入口点。这个方法有一个参数args,它是一个字符串数组,可以在运行程序时传递参数。  (二)这是一个for循环语句,用于循环9次,从1到9,i每次增加1。这个循环用于打印乘法表的每一行。 这

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包