汇编语言(十三)之偶数转成哥德巴赫猜想

将输入的偶数转换成哥德巴赫猜想,输出哥德巴赫猜想

程序运行:

 

代码:


datas segmentmaxESLen         db 0ffhevenSLen         db 0evenString       db 0ffh dup(?)evenNumber       dw  ?prime1           dw 0 prime2           dw 0 inputPrompt      db 'input a even number(number>5):$'outputInvail        db 0dh,0ah,'Invail$'outputNotEven       db 0dh,0ah,'Must be even$'outputNotGreater5   db 0dh,0ah,'Must greater than or equal to 6$'GoldbachConjectureValue        db 0dh,0ah, 40 dup(?)datas endsstacks segment stackdb  100h dup(?)stacks endscodes segmentassume cs:codes,ds:datas,ss:stacks
main   proc  far
start:push dsmov ax,0hpush axmov ax,datas          ;初始化dsmov ds,ax;输出输入数字提示lea dx,inputPromptmov ah,9int 21h;输入数字字符串lea dx,maxESLenmov ah,10int 21h;将字符串转换成十进制数lea si,evenStringcall todigit;判断转换是否有效cmp bx,0jnz availableData         ;若有效,则跳转;若无效,则输出Invaillea dx,outputInvail       mov ah,9int 21hjmp exit                  ;跳转至退出availableData:mov evenNumber,ax	            ;保存输入的数cmp ax,6                         ;比较该数与6jae s                            ;若大于等于6,则跳转至判断该数是否是偶数;若小于6,则输出Must greater than or equal to 6lea dx,outputNotGreater5         mov ah,9int 21hjmp exit                         ;跳转至退出s:test ax,1                           ;判断该数是否是偶数jz s1                               ;若是偶数,则跳转查找歌德巴赫猜想;若不是偶数,则输出Must be evenlea dx,outputNotEven                mov ah,9int 21hjmp exit                             ;跳转至退出s1:mov ax,evenNumber                    ;将输入的数移至axcall findGoldbachConjecture          ;查找哥德巴赫猜想exit:	   retmain endptodigit proc near;si=EA  ax=number,bx=available;保存寄存器push cxpush dxpush simov ax,0            ;十进制数的低16位mov dx,0            ;十进制数的高16位mov di,10           ;除数mov cl,[si-1]         ;将字符串的个数移至clmov ch,0              ;清除chdigits:mov bl,[si]             ;将字符移至blcmp bl,'0'              ;判断字符与‘0’的大小jl invail               ;若小于‘0’,则字符为无效cmp bl,'9'              ;判断字符与‘9’的大小jg invail               ;若大‘9’,则字符为无效mov bh,0                ;bh清0sub bl,30h	           ;字符转换成数字的值mul di                  ;左移一位数乘10add ax,bx               ;加上个位的和adc dx,0add si,1                ;移至下一个字符的索引loop digitscmp dx,0                ;比较十进制数的高16位是否为0jnz invail              ;若不为0,则跳转说明字符串数是无效的mov bx,1                ;否则设置bx为1jmp dexit               ;跳转至退出invail:mov bx,0                ;无效则设置bx为0;恢复寄存器dexit:pop sipop dxpop cxret
todigit endpfindGoldbachConjecture proc near ;ax=source ;保存寄存器push cxpush dxpush bxpush sipush dimov cx,ax         ;将哥德巴赫猜想的数移至cxmov si,2          ;从2开始查找素数mov di,cx         ;将哥德巴赫猜想的数移至dishr di,1          ;取该数的一半ps:call isPrimeNumber      ;判断si是否为素数cmp bx,0                ;判断返回值是否有效jz next		            ;若不为素数,则跳转下一个数mov dx,cx               ;若为素数,则将哥德巴赫猜想的数移至dxsub dx,si               ;求差push si                 ;保存simov si,dx                     ; 将差移至sicall isPrimeNumber            ;判断差是否为素数pop si                        ;恢复sicmp bx,0                      ;判断返回值是否有效jz next                       ;若不为素数,则跳转下一个数call outputGoldbachConjecture        ;若为素数,则输出哥德巴赫猜想next:inc si                               ;查找下一个数是不是素数cmp si,di		                     ;判断si是否大于哥德巴赫猜想的数的一半jbe ps                               ;若小于等于,则循环继续;恢复寄存器pop dipop sipop bxpop dxpop cxretfindGoldbachConjecture endpoutputGoldbachConjecture proc near;保存寄存器push axpush di;设置输出哥德巴赫猜想lea di,GoldbachConjectureValue+2        ;设置输出哥德巴赫猜想的数的字符串地址mov ax,evenNumber                       ;将哥德巴赫猜想的数移至axcall toDecimalist                       ;转换成数字字符mov byte ptr [di],'='                   ;保存‘=’inc di                                  ;移至下一个字符保存的索引mov ax,si                               ;将第一个素数移至axcall toDecimalist                       ; 转换成数字字符mov byte ptr [di],'+'                   ;保存‘+’inc di                                      ;移至下一个字符保存的索引mov ax,dx                                   ;将第二个素数移至axcall toDecimalist                           ;转换成数字字符mov byte ptr [di],'$'                       ;设置字符串的结束符;输出哥德巴赫猜想lea dx,GoldbachConjectureValuemov ah,9int 21h;恢复寄存器pop dipop axret
outputGoldbachConjecture endpisPrimeNumber proc near;si=source bx=isPrime;保存寄存器push dxpush sipush dimov bx,si        ;将判断素数的数移至bxcmp bx,2         ;判断该数是否为2jz prime         ;若为2,则跳转说明该数为素数cmp bx,3         ;判断该数是否为3jz prime         ;若为3,则跳转说明该数为素数mov di,bx        ;将该数移至dishr di,1         ;取该数的一半mov si,2         ;判断素数从2开始cmp si,di        ;判断si是否大于该数的一半ja notPrime      ;若大于,则该数不是素数pIS:mov ax,bx               ;将该数移至axmov dx,0                ;无符号数扩展            div si                  ;除以sicmp dx,0                ;判断余数是否为0jz notPrime             ;若余数为0,则不是素数,跳转inc si                  ;若余数不为0,则si加1cmp si,di               ;比较si与该数的一半的大小jbe pIS                 ;若小于等于,继续循环prime:mov bx,1                 ;是素数,设置bx为1jmp pexit                ;跳转至退出notPrime:  mov bx,0                 ;不是素数,设置bx为0;恢复寄存器pexit:pop dipop sipop dxret
isPrimeNumber endptoDecimalist proc near;ax=source di=EA;保存寄存器push cxpush dxpush bxmov cx,0                        ;计数器,计算十进制数的位数mov bx,10                       ;除数ps:mov dx,0                       ;无符号数扩展div bx                         ;除以10push dx                        ;保存余数inc cx                         ;计数器加1,位数增加cmp ax,0                       ;判断被除数是否为0jnz ps                         ;若非0,则循环继续ps1:pop dx                         ;弹出余数add dl,30h                     ;转换成数字字符mov [di],dl                    ;保存数字字符;mov ah,2                    ;int 21hinc di                         ;移至下一个字符保存的索引loop ps1         ;恢复寄存器pop bxpop dxpop cxret
toDecimalist endpcodes endsend main

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机入门的一些常用小技巧总结

“大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。”今天总结了一些windows中常用的小技巧,也是明天上课需要演示的,希望对初入计算机行业的你们有所帮助,哈哈哈哈。常用shutdown命令:1.定时…

汇编语言(十四)之判断字符串是否包含数字

输入一串字符串,判断字符串里面是否包含数字,如果包含数字输出把cl的第五位设置为1,否则设置为0 程序运行: 代码: datas segmentSTRING_maxLength db 0ffhSTRING_Length d…

UnitOfWork知多少

1. 引言 Maintains a list of objects affected by a business transaction and coordinates the writing out of changes and the resolution of concurrency problems.Unit of Work --Martin Fowler Unit Of Work模式,由马丁大叔提出,是一种数据访问模…

表扬几位积极的同学!

“大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。”这几天太忙了,几天才回家一次,总有忙不完的活在干。4班这几天同学们表现还不错,布置的作业都能按时完成,课堂上也比较活跃,比…

中山纪念中学培训15天总结

比赛 2018/7/6-纪中某C组题【jzoj1192,jzoj1397,jzoj1736】 上来就集体爆零 2018/7/7-纪中某C组题【jzoj1494,jzoj1495,jzoj1496,jzoj1497】 还比较好 2018/7/8-纪中某C组题【jzoj1619,jzoj1620,jzoj1621,jzoj1622】 发现了dp方面的不足 2018/7/9-纪中某B组题【jzoj1503…

汇编语言(十五)之找出两个数组中的相同元素

找出两个数组中的相同元素,并且输出 程序运行: 代码: datas segmentA dw -1,-2, 3, 4, 5, 6, 7, 8, 9, 10,-11, 12, 13, 14, 15ACount dw ($-A)/2B dw -1, 2,-3, 4,-5, 6,-7, 8, 9,-10, 11,-12, 13,-14, 15,16,17,18,…

如何编写更好的SQL查询:终极指南-第一部分

结构化查询语言(SQL)是数据挖掘分析行业不可或缺的一项技能,总的来说,学习这个技能是比较容易的。对于SQL来说,编写查询语句只是第一步,确保查询语句高效并且适合于你的数据库操作工作,才是最重…

汇编语言(十六)之三数值求和

输入A、B、C三个数,如果存在一个数为0,则全部清零,否则求和输出 程序运行: 代码: datas segmentA dw 1B dw 0D dw 3S dw 0a_string db 0ffh, 0 ,100 dup(?)b_string db 0ffh, 0 ,100 dup(?…

回忆四班的那些事儿~

10“大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。”今天,谈谈四班的那些事儿吧~对于四班,回忆满满,根本忘却不了。和别的班一样,一个班内总有那么几个调皮捣蛋的孩子,只是四班…

C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码

本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要.. 想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈... 今天的学习内容? 也只讲一个,关于Xamarin.Forms针对各个平台如何进行可定制化的布局操作. 也就是针对某个平台…

汇编语言(十七)之判断三个数是否相等

输入三个数,计算相等数的个数 程序运行: 代码: datas segmenta db 0ffh, 0 ,100 dup(?)b db 0ffh, 0 ,100 dup(?)d db 0ffh, 0 ,100 dup(?) ARRAY dw 1,2,2inputA db input a$inputB db 0dh,0ah,i…

你想象中的实习是什么样的?

“大家好,我是雄雄,欢迎关注微信公众号:????雄雄的小课堂????。”今天感谢学长小李同学投稿的文章,在校外实习一年,可谓收获满满,下面就是李心焱同学的实习感悟,请欣赏!实习…

汇编语言(十八)之求两个数的最大公约数

输入两个数,使用辗转相除法求最大公约数 程序运行: 代码: datas segmentM_max_len db 0ffhM_len db 0M_string db 100 dup(?)M dw 0 N_max_len db 0ffhN_len db 0N_string db…

Orleans—一些概念

这个文章聊一聊Orleans的概念.以下文章大部分翻译自官方教程,还有一些结合实际的应用经验,并对以前文章留下的坑进行填平.如果有哪个坑没有填,还请告诉我. Grain的生命周期: 一个Grain在逻辑上是永远存在的,并在逻辑上拥有一个不变的标识.程序的代码永远不会去创造或者销毁一个…

使用jdbc连接mysql数据库代码示例

“大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。”最近,正好在看jdbc,于是就整理了一份增删改查的案例,记录记录,以备后用!!java编辑器:myeclipse![10]…

POJ1958-Strange Towers of Hanoi【递推】

正题 题目链接:http://poj.org/problem?id1958 大意 有4根柱子的汉诺塔,有n个盘,求移动次数 解题思路 首先我们定义只有三根柱子时有n个盘的话移动次数是dndn,然后dndn−1∗21dndn−1∗21定义有四根柱子时有n个盘移动次数为fn…

[上海站] 微软Azure AspNetCore微服务实战

活动介绍 2017官方发布了EshopOnContainers的微服务项目,其结合了.Net Core、Azure、Docker等众多优秀的技术,为开发者们抛砖引玉,走进微服务的大门。 本次分享,我们将结合实际毫无保留的从代码上解析微服务架构,以实…

汇编语言(十九)之删除数组中的元素

在数组中删除所有-1元素,然后输出删除后的长度 程序运行: 代码: datas segmentLink dw 15 ,1,2,3,4,5,6,-9,-1,3,4,5,3,-1,-2,3ouput db Link length:$ datas endsstacks segment stackdb 100h dup(?)stacks endscodes segmentassume cs…

Linux+.NetCore+Nginx搭建集群

本篇和大家分享的是LinuxNetCoreNginx搭建负载集群,对于netcore2.0发布后,我一直在看官网的文档并学习,关注有哪些新增的东西,我,一个从1.0到2.0的跟随者这里只总结一句话:2.0版本,api更多&…

老师 累了,我们 泪了!

“以下文章来自一位不愿意透露姓名的同学所写:”呀呼 “老穆头” 没错是我们的穆老师悄悄往我们班探了探头瞧了瞧我们, 我们依旧对他那么热情,紧随其后老佟往门口一站 教室里立马严肃起来 她是我们级部出了名没人敢惹的老佟(佟老…