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

效果

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

二、整数拆分

问题描述

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

效果

 

三、素数环

问题描述

素数环

题目:输入正整数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

效果

四、迷宫问题

问题描述

有一个 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

效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/6794.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

给对象新增两个数组,并分别给对象名称、名字

给对象新增两个数组&#xff0c;并分别给对象名称 代码如下&#xff1a; let a {}a.shuzu [1, 2, 3]a.zhangzu [5, 6, 7]console.log(测试添加, a)console.log(打印后台传递的值, this.res)

ToBeWritten之物联网MQTT、Z-Wave等协议

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

gpt训练数据-网页版chat软件

gpt-3 中文 api 目前&#xff0c;OpenAI官方并没有针对GPT-3的中文API&#xff0c;但是有一些第三方机构或者开发者提供了自己的中文API接口&#xff0c;可以使用GPT-3模型进行中文文本生成&#xff0c;利用这些API可以简单地进行中文文本生成等任务&#xff0c;尤其是对于不擅…

详解电容加速电路-加速电容

基本的晶体管开关电路 饱和开关的问题点&#xff1a;关断延时时间 如图1所示&#xff0c;使场效应晶体管开关动作时&#xff0c;加给晶体管的基极电流IB&#xff1a; IBIC/hFE。 晶体管饱和动作时&#xff0c;如图2所示&#xff0c;基极电流IB&#xff0c;即使为0&#xff…

【基础】索引

索引目的&#xff1a; 快速的查找我们的数据 索引的优势和劣势 优势 类似于书籍的目录索引&#xff0c;提高数据检索的效率&#xff0c;降低数据库的io成本 通过索引列对数据进行排序&#xff0c;降低数据排序的成本&#xff0c;降低CPU的消耗 劣势 实际上索引也是一张表&…

【艾特淘】电商干货-淘宝新卖家运营的8个步骤

1、选品 选品是运营的第一步&#xff0c;后续的运营工作都是以商品为载体&#xff0c;以挖掘市场潜力商品&#xff0c;帮助提升宝贝效果&#xff0c;优化库存状况&#xff0c;监控热销单品&#xff0c;跟踪竞争对手&#xff0c;打造爆款为运营主要目标。 1、行业热销品类、品牌…

⭐蓝桥杯高频题单——1.子串分值和(枚举 / 计算贡献 / 前缀数组 / 哈希思想)

⭐子串分值和⭐ 方法一&#xff1a; 暴力 在做这道题的时候我想到了以前力扣做的一道Leetcode.78. 子集__DFS算法剖析讲解。初始我的想法是通过深搜找到所有可能的子串&#xff0c;再对他们分别计算f(S)&#xff0c;从而得到所有的f(S)之和。但是经过思考发现&#xff0c;这里…

ChatGPT让现在的软件都土掉渣了

我们家有两个娃&#xff0c;每次我们想要出去时订个酒店时都好麻烦。我在某程上找&#xff0c;我先看有没有家庭房&#xff0c;但家庭房很少&#xff0c;而且有些家庭房实际上只能睡得下两大一小。普通房间能不能睡得下四个人&#xff0c;那可是得查看很多信息&#xff0c;如床…

SpringBoot——SB整合mybatis案例(残缺版本)第四集(真*大结局)

基础登录功能 要求输入用户名和密码然后从对应的数据库员工表当中查询是否存在对应员工: 查询成功 查看接口文档 响应数据中有一个JWT令牌。 实现思路 新建一个LoginController用于接收登录请求&#xff0c;然后调用EmpService中的借口进行查询操作。 三层架构的代码 Pos…

病毒丨熊猫烧香病毒分析

作者丨黑蛋 一、病毒简介 病毒名称&#xff1a; 熊猫烧香 文件名称&#xff1a; 40fee2a4be91d9d46cc133328ed41a3bdf9099be5084efbc95c8d0535ecee496 文件格式&#xff1a; EXEx86 文件类型(Magic)&#xff1a; MS-DOS executable 文件大小&#xff1a; 29.30KB SHA256&…

【阅读论文】USAD:多变量时间序列上的无监督异常检测

USAD : UnSupervised Anomaly Detection on Multivariate Time Series 摘要 IT系统的自动监控是Orange目前面临的挑战。考虑到其IT运营所达到的规模和复杂性&#xff0c;随着时间的推移&#xff0c;用于推断正常和异常行为的测量所需的传感器数量急剧增加&#xff0c;使得传统…

【C++】内存管理+模板

前言&#xff1a; 本章将详细讲解C内存管理和模板的实现。 第一部分我们讲解C内存管理&#xff0c;C语言中有malloc/calloc/realloc等开辟空间和free释放空间&#xff0c;那么C将符合实现呢&#xff1f; 第二部分我们会一起来初步认识模板与泛型编程&#xff0c;并详细探讨函…

微服务高级篇【1】之微服务保护

文章目录前言一 初识Sentinel1.1 雪崩问题1.2 解决方法1.3 小结1.4 服务保护技术对比1.5 Sentinel介绍1.6 Sentinel安装1.7 微服务整合Sentinel二 测试工具&#xff1a;Jmeter2.1 Jmeter安装和配置2.2 Jmeter快速入门2.2.1 设置中文语言2.2.2 设置Jmeter桌面快捷图标2.3 Jmeter…

已经提了离职,还有一周就走,公司突然把我移出企业微信,没法考勤打卡, 还要继续上班吗?...

黎明前的黑暗最容易出事&#xff0c;离职前的几天也最容易出幺蛾子&#xff0c;比如下面这位网友的遭遇&#xff1a;已经提了离职&#xff0c;还有一周就正式离职了&#xff0c;公司突然把我移出企业微信&#xff0c;没法考勤打卡了&#xff0c; 还要继续上班吗&#xff1f;该怎…

BGP小型实验

实验分析 1.主要考察的是对BGP配置的熟练 2.实验需要在R1与R5分别发布一条路由可以在BGP 中使用network 网段 掩码命令 3.R1与R2,R4与R5是EBGP&#xff0c;而R2,R3,R4是IBGP 实验操作 1.配置接口ip,与环回路由 以R1为例 2.AS内部需要实现非直连的建立是需要保证IBGP内部是通的所…

蓝桥杯30天真题冲刺|题解报告|第三十天

大家好&#xff0c;我是snippet&#xff0c;今天是我们这次蓝桥省赛前一起刷题的最后一天了&#xff0c;今天打了一场力扣周赛&#xff0c;前面3个题都是有思路的&#xff0c;第三个题只过了一半的案例&#xff0c;后面看完大佬们的题解彻悟&#xff0c;下面是我今天的题解 目录…

蓝桥杯备考

数论&#xff1a;判断素数&#xff0c;鸽笼定理&#xff0c;抽屉理论 注意事项&#xff1a; long类型的数后面要加L long s 2658417853L; 保留几位小数&#xff1a; System.out.printf(“%.2f”, arg); 四舍五入问题&#xff1a;比如保留两位小数&#xff0c;就在数的后面再…

java基础知识汇总

目录 1、Java基础语法 1、类型转换问题 1. 运算符 1.1 算术运算符&#xff08;理解&#xff09; 1.2 赋值运算符&#xff08;应用&#xff09; 1.3 自增自减运算符&#xff08;理解&#xff09; 1.4 关系运算符&#xff08;应用&#xff09; 1.5 逻辑运算符&#xff08…

【CSS】清除浮动 ④ ( 清除浮动 - 使用双伪元素清除浮动 | 代码示例 )

文章目录一、清除浮动 - 使用双伪元素清除浮动二、代码示例一、清除浮动 - 使用双伪元素清除浮动 为 .clearfix:before 和 .clearfix:after 并集选择器 , 设置如下样式 : /* 清除浮动 - 使用双伪元素清除浮动 */.clearfix:before,.clearfix:after {content: "";displ…

ERTEC200P-2 PROFINET设备完全开发手册(1)

本教程为ERTEC200P-2的基础开发教程&#xff0c;可以掌握PN设备开发的基本流程。虽然没有涉及PN协议的详细解析&#xff0c;但是希望根据本文档多多练习&#xff0c;熟能生巧&#xff0c;逐渐能够掌握PN设备开发。 &#xff08;注意&#xff1a;本手册基于西门子DEVKIT V47协议…