汇编炮弹弹道计算实验
文章目录
- 一、先使用c语言编写
- 二、翻译为汇编语言
1.编写一个汇编程序,完成如下要求:
(1)程序包含必要的数据定义语句,保存中间运算结果。
(2)程序通过键盘炮弹的初速度与炮弹与地平线的夹角,输入值的类型为浮点数。
(3)程序输出炮弹能够达到的最高高度和最远记录,格式为:
The maximum height is 高度 meters and the farthest record is 距离 meters
(4)由于正弦与余弦函数的计算是会被重复使用的代码,因此需要用过程来实现,实验要求用汇编语言实现
下载汇编INCLUDE floatio.inc包
https://blog.csdn.net/Cyy246/article/details/117716936
一、先使用c语言编写
#include<stdio.h>
#include<math.h>
//最高高度和最远记录
float getsin(float x){float sum,a,b; //sum代表和,a为分子,b为分母char s;s=1;sum=0;a=x; //分子赋初值b=1; //分母赋初值for(int i=1;a/b>=1e-6;i++) //精确到0.000001{sum=sum+s*a/b; //累加一项a=a*x*x; //求下一项分子 x的3, 5, 7次方b=b*2*i*(2*i+1); //求下一项分母 1*2*3,1*2*3*4*5,1*2*3*4*5*6*7s*=-1;}printf("sin%f=%f\n",x,sum);return sum;
}
float getcos(float x){float sum,a,b; //sum代表和,a为分子,b为分母char s;s=1;sum=0;a=1; //分子赋初值b=1; //分母赋初值for(int i=1;a/b>=1e-6;i++) //精确到0.000001{sum=sum+s*a/b; //累加一项a=a*x*x; //求下一项分子 x的2, 4, 6次方b=b*i*2*(2*i-1); //求下一项分母 1*2,1*2*3*4,1*2*3*4*5*6s*=-1;}printf("cos%f=%f\n",x,sum);return sum;
}
float getT(float v,float x){float t,g=9.8;t=v*x/g;printf("t:%f",t);return t;
}float getH(float t){float H,g=9.8;H=g*t*t/2;return H;
}
float getC(float t,float x,float v){return t*x*2*v;
}
void main()
{float x,t,v,h,c;printf("发射角度\nx取0-π/2(约等于1.5707963)\nX=");scanf("%f",&x);//角度printf("发射速度\V=");scanf("%f",&v);//速度float sumsin=getsin(x);//sinfloat sumcos=getcos(x);//cost=getT(v,sumsin);//上升到最高所要时间h=getH(t); //最高c=getC(t,sumcos,v);//最远printf("高%f",h);printf("远%f",c);}
二、翻译为汇编语言
INCLUDE Irvine32.inc
INCLUDE macros.inc
INCLUDE floatio.inc
.data
cyy118 real8 ? ;输入角度 输入0.523599
cyy1182 real8 ? ;输入初速度 输入10.0
jiaodu real8 1.5707963 ;通过 cos角度= sin(π/2-角度) ,带入求sin函数中求cos
jiao real8 180.0
fenzi real8 0.0 ;分子
fenmu real8 1.0 ;分母 初始化分母
sum real8 0.0 ;和
fan1 real8 1.0 ;乘-1
fan2 real8 -1.0 ;乘-1 ;cyy118
jie real8 1.0 ;阶乘 变量
guding1 real8 1.0 ;固定为1,为阶乘变量增加服务
guding2 real8 2.0 ;固定为2,为分母变量服务
sin real8 0.0 ;正弦值 0.5
cos real8 0.0 ;余弦值 0.866025
tt real8 0.0 ;到达最高所需时间 0.510204
gg real8 9.8 ;重力加速度
cc real8 0.0 ;最远距离 8.836995
hh real8 0.0 ;最高距离 1.275511
.codegetfenmu procfld jie fld guding2fmul ;st0 = jie * 2fld guding1fadd ;st0 = st0 + 1fld jie fmul ;st0 = st0 * jiefld guding2 ;cyy118fmul ;st0 = st0 * 2fld fenmufmul ;st0 = fenmu * st0fstp fenmu ;fenmu = st0ret
getfenmu endpsinandcos procmov ecx,8L1: ;求sinfld fan1 ;-1*分子 fld fenzi ;st0,st1fmul ;st0 = fan1 * fenzifld fenmufdiv ;st0 = st0 / fenmufld sumfadd ;st0 = st0 + sumfstp sum ;去浮点数ST(0)到sum,执行出栈操作 sum = st0 Nullfld fenzifld cyy118fmul ;st0 = fenzi * cyy118fld cyy118fmul ;st0 = st0 * cyy118fstp fenzi ;fenzi = st0 Nullcall getfenmu ;获得分母fld jie ;cyy118fld guding1fadd ;st0 = jie + guding1fstp jie ;jie = st0 NUllfld fan1fld fan2fmul ;fan1 = fan1 * -1 fstp fan1loop L1 ret ;cyy118
sinandcos endpmain PROCmWrite "angle x=(0-90): "call ReadFloatfstp cyy118mWrite "speed V= "call ReadFloatfstp cyy1182fld cyy118fld jiaofdivfldpifmulfstp cyy118fld cyy118fstp fenzi ;初始化分子 去浮点数ST(0)到dst,执行出栈操作call sinandcos ;获得sinfld summWrite "sinx=" ;cyy118call WriteFloatfstp sincall ShowFPUStack ;cyy118fld jiaodufld cyy118fsubfstp cyy118fld guding1fst fenmufst jie ;cyy118fstp fan1fld cosfstp sumfld cyy118fstp fenzicall sinandcos ;获得cosfld summWrite "cosx="call WriteFloatfstp coscall ShowFPUStackfld sinfld cyy1182fmul ;cyy118fld ggfdiv ;st0 = st0 / ggmWrite "T="call WriteFloatfstp ttcall ShowFPUStack ;cyy118fld ggfld ttfmul ;st0 = gg * ttfld ttfmul ;st0 = st0 * ttfld guding2fdiv ;st0 = st0 / 2mWrite "The maximum height is"call WriteFloatfstp hhcall ShowFPUStack ;cyy118fld ttfld cosfmulfld guding2fmulfld cyy1182fmulmWrite "the farthest record is:" ;cyy118call WriteFloatfstp cccall ShowFPUStack
main endp ;cyy118
END main
汇编炮弹弹道计算实验相关推荐
- Linux之ARM(IMX6U)裸机汇编LED驱动实验--烧写bin文件到SD卡中并运行
Linux之ARM(IMX6U)裸机汇编LED驱动实验--烧写bin文件到SD卡中并运行 代码烧写 2.烧写的工具 2.把生成的将 imxdownload 放在工程目录下(led.bin同一个文件夹下 ...
- 驱动开发指南 第八章 汇编LED灯实验
<I.MX6U 嵌入式 x Linux 驱动开发指南 V1.6 6>第八章 汇编LED灯实验 正点原子[第二期]手把手教你学Linux之ARM(MX6U)裸机篇 视频 选集 时间 P6 第 ...
- Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动
Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动 前言 编译代码 1.把 .s 文件编译成 .o文件 2.把 .o文件编译成连接文件 .elf 3.arm-linux-gnueabi ...
- Alientek I.MX6UL Linux-第八章 汇编LED灯实验
第八章 汇编LED灯实验 GPIO功能图 IO控制初始化所需要用到的寄存器 1. SW_MUX_CTL Register Address:20E_0000h base+5Ch offset=20E ...
- ARM(IMX6U)裸机汇编LED驱动实验——驱动编写、编译链接起始地址、烧写bin文件到SD卡中并运行
参考:Linux之ARM(IMX6U)裸机汇编LED驱动实验–驱动编写 作者:一只青木呀 发布时间: 2020-08-07 09:13:48 网址:https://blog.csdn.net/weix ...
- 嵌入式Linux(二)汇编LED驱动实验
目的: 并不是系统的学习汇编,而是在linux开发中有时候需要使用汇编置零进行一些初始化的工作. 1. I.MX6ULL的IO初始化流程: 6ULL的IO命名:IOMUXC_SW_MUC_CTL_PA ...
- 单片机实验汇编案例---计数器实验
一.实验要求 8031内部定时计数器,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数.使用8031的T1作定时器,50ms中断一次,看T0内每0.50ms来了多少脉冲,将其数值按二进制数在7 ...
- ARM(IMX6U)裸机C语言版本LED驱动实验(汇编进入处理器SVC模式、SP堆内存、跳转main函数、链接起始地址)
参考:Linux之ARM(IMX6U)裸机C语言LED驱动实验–驱动编写,编译 作者:一只青木呀 发布时间: 2020-08-11 11:20:17 网址:https://blog.csdn.net/ ...
- 汇编学习笔记:对抗反汇编实验2019092801
汇编学习笔记:对抗反汇编实验2019092801 实验描述 实验环境 实验过程 实验结论 实验描述 使用相连的jz和jnz指令跳转到紧接着jnz指令的call指令的第二个字节.call指令实际上无效. ...
最新文章
- 【Cmake】执行cmake命令时报错:No XSLT processor found
- MMDetection V2.0:更快更强的通用目标检测平台
- 局域网防雷电***实用解决方案
- Quartus16.1布线优化选择,重编译可能会满足时序
- mysql为什么表大了要重建_为什么MySQL分库分表后总存储大小变大了?
- win linux 远程桌面连接,Windows 连接 Ubuntu 16.04 远程桌面
- MongoDB- 简单操作命令
- 什么是javax.ws.rs.core.context? [第5部分]
- qt sizePolicy属性
- android 接收SDCcard插拔的广播
- 2008年6月6日今天终于调回公司本部啦,记录历史的一天。
- html 图片查看 ie8,本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
- linux grep 如何搜索出包含某个字符串的所有文件 find
- 基于Vue和Spring Boot的在线视频播放系统 (模仿咪咕视频)
- c语言铺地板,【北理乐学】铺地板
- Could not connect to appstore: cURL error 28: Operation timed out after 60000 milliseconds with
- python寻找所有三位数素数_寻找所有的素数的python实现
- 家电售后APP软件开发作用特点
- 基于STM32的多功能MP3设计 毕业设计(论文)开题报告
- Image captioning评价方法之ROUGE-L
热门文章
- 楼宇节能改造?这套楼宇节能减排方案你得看看
- c语言do while什么意思,c语言中while与do while循环的主要区别是什么_后端开发
- CUDA 半浮点数运算
- 官方正版授权 MAXQDA 标准版、专业质、专业增强版性数据分析工具软件
- Windows系统SVN SERVER迁移。从服务器A迁移到服务器B
- Ubuntu 下 kazam 录屏 没声音解决方案
- kettle教程---kettle作业调度,根据更新时间增量更新
- 学习笔记19--定位系统之惯性导航定位
- puttygen 命令行 id_rsa.pub 转 ppk
- ADAS-CIS相机关键参数综述