汇编语言系列之汇编实现简单数学运算

目录
  • 5.计算S=1+2×3+3×4+4×5+···+N(N+1)
    • 5.1设计要求:
    • 5.2设计思路:
    • 5.3程序清单:
    • 5.4程序运行结果及分析:
  • 6.计算N!
    • 6.1设计要求:
    • 6.2设计思路:
    • 6.3程序清单:
    • 6.4程序运行结果及分析:

软件:emu8086

语言:汇编语言(Assembly)

注意:本文列出了两种算术运算的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用。

5.计算S=1+2×3+3×4+4×5+···+N(N+1)

5.1设计要求:

设计程序,实现数学公式S=1+2×3+3×4+4×5+···+N(N+1)的算法。数值N由加键盘输入,计算结果在显示终端输出。设计要求:计算结果不超过十六位寄存器的存储能力,如有溢出提示错误。

5.2设计思路:

输入N值然后把N给BH作为循环次数,通过循环实现乘和累加计算,结果为十六进制,通过除以10得到十进制,存入堆栈再依次输出。

5.3程序清单:

DATA SEGMENT
     pkey   DB  0dh,0ah,"pleas input N end by ';' :$"
     over   DB  0AH,0DH,"overflow!",0dh,0ah,'$'
     result  DB  0dh,0ah,'result is:','$'
     DAT1  DB  8 DUP(0)
DATA ENDS

STACK SEGMENT
    SSTACK DB 100 DUP(0)
STACK ENDS 

CODE SEGMENT
     ASSUME CS:CODE,DS:DATA,SS:STACK 

STATE:
    MOV AX,DATA
    MOV DS,AX
    LEA SI,DAT1     ;开辟缓冲区
    LEA DX,pkey
    MOV AH,9
    INT 21H         ;DOS功能调用,输出字符串

LLP:MOV AH,1
    INT 21H         ;DOS功能调用,输入N值
    SUB AL,2FH
    INC DX          ;DX计数
    MOV [SI],AL     ;将输入的数据存在SI缓冲区
    INC SI
    CMP AL,0CH      ;输入为封号结束输入
    JNZ LLP
    SUB SI,2
    CMP DX,02H      ;DX不为2表示输入为两位数
    JNZ LLLP 

LLP1:MOV CX,1
     MOV BL,2       ;赋初始值
     JMP LP
LLLP:
     MOV DI,SI
     SUB DI,1
     SUB [DI],1
     MOV AL,10
     MUL [DI]
     ADD [SI],AX     ;输入是两位数时十位乘10加个位
     SUB AH,AH
     JMP LLP1

LP: MOV BH,[SI]      ;把循环次数给BH
    MOV AL,BL
    INC BL
    MUL BL           ;BL(加1)和AL(原值)相乘给AX
    ADD CX,AX        ;AX和CX相加给CX,通过循环实现累加
    JO  OOF         ;如果溢出重新输入
    CMP BH,BL        ;判断是否达到N值
    JNZ LP
    MOV AX,CX
    MOV CX,0AH
    MOV BX,0                 

LOP:MOV DX,0
    DIV CX         ;AX表示的32位数除以10,商放在AX,余数放在DX
    INC BX
    ADD DX,30H
    PUSH DX           ;将余数依次压入栈
    CMP AX,0
    JNZ LOP           ;商不为0继续除10
    LEA DX,result
    MOV AH,9
    INT 21H           ;DOS功能调用,输出字符串  

OUTPUT:
     POP DX
     MOV AH,2
     INT 21H          ;DX中数据依次出栈并显示
     DEC BX
     JNZ OUTPUT       ;出栈完成后停止
     JMP STATE            

OOF:LEA DX,over
    MOV AH,09H
    INT 21H           ;DOS功能调用,溢出显示
    JMP STATE 

CODE ENDS

END STATE

5.4程序运行结果及分析:

乘法和累加计算根据流程图一步步赋值即可得到,在输入两位数和结果转十进制输出时遇到了麻烦,通过查找资料不断尝试,最终找到了简单的解决办法,即输入两位时移位累加,输出除以10存入堆栈并依次输出显示。

图5 计算S=1+2×3+3×4+4×5+···+N(N+1)设计结果

6.计算N!

6.1设计要求:

掌握汇编语言实现高级语言中数学函数的方法。设计程序,实现数学公式N!=N(N-1)(N-2)······2*1的算法。数值N由键盘输入,计算结果在显示终端输出。设计要求:N的范围为0-65535,即不超出16位寄存器的存储容量。

6.2设计思路:

输入N值,通过循环实现阶乘并将计算结果存入AX,然后十六进制转十进制输出。

6.3程序清单:

DATA SEGMENT
    pkey   DB  0AH,0DH,"Please Input N(1-8):",'$'
    result DB  0AH,0DH,"the results is:",'$'
    over   DB  0AH,0DH,"overflow!",0AH,0DH,'$'
DATA ENDS           

STACK SEGMENT
    SSTACK DB 100 DUP(0)
STACK ENDS          

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK

STATE:
       MOV AX,DATA
       MOV DS,AX   ;数据段初始化

       LEA DX,pkey
       MOV AH,09H
       INT 21H       ;DOS功能调用,显示字符串  

       MOV AH,1
       INT 21H       ;DOS功能调用,输入N
       SUB AL,30H
       CMP AL,08H
       JA  OOF       ;输入大于8溢出 

       XOR AH,AH
       MOV BP,AX     ;赋循环计数值N给BP  

LP:    MOV BX,BP
       DEC BX
       JZ  LLP       ;阶乘次数为BX,BX为0必须马上跳转
       MUL BX        ;AX中存放阶乘结果(十六进制转十进制用)
       DEC BP
       JNZ LP 

LLP:   MOV CX,0
       MOV BX,10

LLLP:  MOV DX,0
       DIV BX        ;AX表示的32位数除以10,商放在AX,余数放在DX
       ADD DX,30H
       PUSH DX       ;将余数转换为ASCII码值并压入栈
       INC CX
       CMP AX,0      ;商不为0就继续除10
       JNZ LLLP 

       MOV AH,09H
       LEA DX,result
       INT 21H       ;DOS功能调用,输出字符串

LOP:   POP DX
       MOV AH,2
       INT 21H       ;DX各位出栈并显示
       LOOP LOP
       JMP STATE   

OOF:   LEA DX,over
       MOV AH,09H
       INT 21H      ;DOS功能调用,溢出显示
       JMP STATE 

CODE ENDS
     END STATE

6.4程序运行结果及分析:

阶乘部分是利用MUL指令AX中存放计算结果并实现阶乘,除阶乘计算部分外,其它部分和第五题类似,同样结果转十进制输出时遇到了麻烦,利用除以10存入堆栈再依次取出并显示来实现。

图6 计算N!设计结果

到此这篇关于汇编语言系列之汇编实现简单数学运算的文章就介绍到这了,更多相关汇编语言数学运算内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 汇编语言之实现发出各种声音

    软件:emu8086 语言:汇编语言(Assembly) 注意:本文列出了响铃,机枪声音,音乐播放的代码,第一个代码为博主独自一人编写,所有代码都会有瑕疵,谨慎使用. 9.响铃设计 9.1设计要求: 要求掌握响铃的使用方法.设计程序,从键盘接收输入字符,如是数字N,则响铃N次,如输入为非数字,则不响铃. 9.2设计思路: 判断输入为0~9之间,将N值给BP,设置响铃延时次数CX输出N次响铃. 9.3程序清单: DATA SEGMENT pkey DB 0AH,0DH,'please input

  • c语言中if语句是怎么变成汇编代码的详解

     1. 要编译的测试代码:  int a; int b = 3; int main(void) { if (3) a = 4; else b = 5; } 2. 词法分析 词法分析将c源代码解析成一个个的token. 关键的,将if两个字符解析成一个if token,后续语法分析的输入就从两个字符减少为1个token,减小了语法分析的难度. 3. 语法分析 if (equal(tok, "if")) { Node *node = new_node(ND_IF, tok); tok =

  • 汇编语言系列之汇编实现各种码制的转换(思路详解)

    目录 1.十六进制转换为二进制数设计 1.1设计要求: 1.2设计思路: 1.4程序运行结果及分析: 2.十六进制转换为十进制数设计 2.1设计要求: 2.2设计思路: 2.3程序清单: 2.4程序运行结果及分析: 3.十六进制转换为ASCII码 3.1设计要求: 3.2设计思路: 3.3程序清单: 3.4程序运行结果及分析: 4.英文字母大小写转换设计 4.1设计要求: 4.2设计思路: 4.3程序清单: 4.4程序运行结果及分析: 软件:emu8086 语言:汇编语言(Assembly) 注

  • 汇编语言 and和or逻辑运算指令的实现

    本文介绍了汇编语言 and,or逻辑运算指令的实现,分享给大家 assume cs:code code segment ; 逻辑运算 按照二进制位运算 start: mov ax,0 mov al, 00001111B and al, 11110000B ; 00000000B mov ax,0 mov al, 00001111B or al, 11110000B ; 11111111B mov ax,4c00H int 21H code ends end start 通过and,or逻辑运算指

  • 汇编语言系列之汇编实现简单数学运算

    目录 5.计算S=1+2×3+3×4+4×5+···+N(N+1) 5.1设计要求: 5.2设计思路: 5.3程序清单: 5.4程序运行结果及分析: 6.计算N! 6.1设计要求: 6.2设计思路: 6.3程序清单: 6.4程序运行结果及分析: 软件:emu8086 语言:汇编语言(Assembly) 注意:本文列出了两种算术运算的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用. 5.计算S=1+2×3+3×4+4×5+···+N(N+1) 5.1设计要求: 设计程序,实现数学公式S=1+

  • 汇编语言系列之汇编实现字符串操作

    目录 7.字符串匹配设计 7.1设计要求: 7.2设计思路: 7.3程序清单: 7.4程序运行结果及分析: 8.字符串输入及显示设计 8.1设计要求: 8.2设计思路: 8.3程序清单: 8.4程序运行结果及分析: 软件:emu8086 语言:汇编语言(Assembly) 注意:本文列出了字符串匹配和字符串输入显示的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用. 7.字符串匹配设计 7.1设计要求: 要求掌握提示信息的设置及读取键入信息的方法.设计程序,从键盘输入两个字符串进行比较,如相

  • 从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例

    本文实例讲述了Node.js基于connect和express框架的多页面实现数学运算.分享给大家供大家参考,具体如下: 1.使用connect框架 .use方法用于绑定中间件到connect服务器,它会配置一系列在接到请求时调用的中间件模块,此例中我们要配置的中间件有favicon logger static router app.get/post/put        写法:app.requestName('path', function(req, res, next){}); app-co

  • JavaScript基于DOM操作实现简单的数学运算功能示例

    本文实例讲述了JavaScript基于DOM操作实现简单的数学运算功能.分享给大家供大家参考,具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"

  • Linux Shell脚本系列教程(五):数学运算

    在任何一种编程语言中,算术运算都是必不可少的,shell也不例外. 一. 使用let.(())和[]进行算术运算 可以使用普通变量赋值方法定义数值,这是,它会被保存为字符串.我们可以通过使用let.(()).[]等操作符,使得这些变量进行算术运算.例如: 复制代码 代码如下: #!/bin/bash no1=4                        #此处no1义字符串形式存储 no2=5                        #此处no2义字符串形式存储 let result=

  • 从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例

    本文实例讲述了Node.js多页面实现数学运算的client端和server端.分享给大家供大家参考,具体如下: 1.server端 支持数学运算的服务器,服务器的返回结果用json对象表示. math-server.js //通过监听3000端口使其作为Math Wizard的后台程序 var math = require('../nodejsExample3/math.js'); var express = require('express'); var app = express(); a

  • 从零开始学习Node.js系列教程四:多页面实现的数学运算示例

    本文实例讲述了Node.js多页面实现的数学运算.分享给大家供大家参考,具体如下: app-node.js var http_port = 3000; var http = require('http'); var htutil = require('./htutil'); var server = http.createServer(function(req, res){ htutil.loadParams(req, res, undefined); if (req.requrl.pathna

  • 通过shell进行数学运算的多种方式

    在Bash中, bash的数学运算有点别扭,很难适应和记住, 只好写个博文, 方便以后翻翻看. 有四种方式可以进行数学运算: 一.let命令 复制代码 代码如下: #/bin/bashnum1=13num2=14let sum=$num1+$num2 echo $sum #自增let sum++ #自减let sum-- #简写形式let sum+=1let sum-=2 #顺便吐槽下,let sum=(1+3)*(2+2)居然不行, 果然很烂有没有! 二. $[]形式 复制代码 代码如下: #

  • PHP数学运算与数据处理实例分析

    本文实例讲述了PHP数学运算与数据处理方法.分享给大家供大家参考,具体如下: 一.数值数据类型 PHP中,数字或数值数据以及数学函数的使用很简单.基本来说,要处理两种数据类型:浮点数和整数.浮点数和整数值的内部表示分别是C数据类型double和int.类似于C,PHP中这些数据类型遵循同样的一组规则. PHP是一种松散类型的脚本语言,变量可以根据计算的需求改变数据类型.这就允许引擎动态地完成类型转换.所以,如果计算中包含数值和字符串,字符串会在完成计算之前转换为数值,而数值则会在与字符串连接之前

随机推荐