汇编小作业(3) 十进制数的平方根

2023-11-13

用子程序结构编程:从键盘输入一个十进制数,对其开平方后分别将其平方根和余数以十进制数的形式显示。

DATA  SEGMENT                                
 SUM  DW  2 DUP(?)   
 BUF  DB  7 DUP(?)     
DATA  ENDS 
stack segment      ;定义栈段,保存div的余数
	dw 40 dup (?)
stack ends
                 
CODE  SEGMENT                
      ASSUME  CS:CODE,DS:DATA      
START:MOV  AX,DATA            
      MOV  DS,AX
      CMP  AL,0DH
      JE   OUTIT
      CALL DIB

OUTIT:MOV  AX,BX
      CALL SQUR
      MOV  SUM,CX
      MOV  SUM+2,AX
      MOV  AX,CX
      CALL  BID
      MOV  DL,','    ;显示‘,’
      MOV  AH,2          
      INT  21H
      MOV  AX,SUM+2
      CALL  BID     
      MOV  AX,4C00H          
      INT  21H
 
; 有符号的二进制数(即十六进制数)转换为十进制数并显示。这里采用另一种方法来进行数制的转换:
; 将要转换的数存入AX中,先用AX 中值除10,得的余数就是个位数;再用上次得的商除10,得的余数
; 就是百位数;再用上次得的商除10,得的余数就是千位数;依次得每位十进制数压栈,直到商为0; 然后又依次出栈到缓冲区,在缓冲区中得到由高到低位的顺序并用显示字符串方式显示结果。     
BID PROC  NEAR
    PUSH  BX      ;现场的保护
    PUSH  CX            
    PUSH  DX            
    PUSH  SI         
     LEA  SI,BUF
      OR  AX,AX
     JNS  PLA1   ;正数可直接转换
     NEG  AX     ;负数求补得绝对值
    MOV BYTE PTR [SI],'-';存‘-’
     INC  SI
PLA1:MOV  BX,10
     MOV  CX,0
REP2:MOV  DX,0
     DIV  BX
    PUSH  DX       ;余数压栈
     INC  CX       ;位数计数
      OR  AX,AX     
     JNZ  REP2     ;商不为0则循环
     REP3:POP  AX    ;依次出栈到缓冲区
     ADD  AL,30H  ;转换为ASCII码
     MOV  [SI],AL
     INC  SI
    LOOP  REP3      
  MOV  BYTE PTR [SI],'$';结束符
     LEA  DX,BUF   ;显示
     MOV  AH,9
     INT  21H
     POP  SI       ;现场的恢复
     POP  DX
     POP  CX
     POP  BX
     RET 
BID ENDP

; 键入十进制数转为十六进制数存在BX中。
; 从键盘输入的十进制数,实际上是得到十进制数字符的ASCII码,所以,首先要将十进制数字符
; 的ASCII码(30H~39H)转换为十进制数(09),再将其转换为十六进制数。
; 要将十进制数234转换为十六进制数,可用如下公式:234=((0*10+2)*10+3)*10+4完成。由于
; 计算机中的算术运算指令都是二进制数运算,所以,运算得的结果就是二进制数,即十六进制数。
DIB  PROC  NEAR        
     MOV  BX,0          
REP1: MOV  AH,1           
    INT  21H  
    SUB  AL,30H
    JL  EXIT          
    CMP  AL,9       
    JG  EXIT       
    CBW
    XCHG  AX,BX
    MOV  CX,10
    MUL  CX
    ADD  BX,AX   
    JMP  REP1
EXIT: RET
DIB  ENDP
     
; 将一个数开平方,平方根和余数分别存入SUM和SUM+2; 开平方的算法:N的平方等于N个自然奇数之和。N^2^=1+3+5+……+2N–1; 从这个数中依次减去奇数135、…,至被开方数小于下一个奇数为止,累计减去奇数的个数就是S的整数平方根。减完剩下的值就是余数。
SQUR PROC  NEAR
     PUSH  DX 
      MOV  CX,0      ; 初始化平方根的值
      MOV  DX,1      ; 自然奇数的首项送DX
REP1: CMP  AX,DX           
       JB  EXIT
      SUB  AX,DX
      INC  CX
      ADD  DX,2
      JMP  REP1
EXIT: POP  DX
      RET    
SQUR  ENDP 

CODE  ENDS
      END  START

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汇编小作业(3) 十进制数的平方根 的相关文章

  • 汇编王爽老师实验12,显示0号除法溢出中断

    整个程序不能脱离dosbox 在dosbox中触发中断 本程序的思路是 先编写0号中断子程序 在主程序中运用传送方法把中断子程序传送至内存段 1设置传送的起点2设置传送的终点3设置传送的代码段长度4设置传送的方向5rep 启动传送6修正中断
  • Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取

    Windows系统调用架构分析 也谈KiFastCallEntry函数地址的获取 windows api 汇编 hook 存储 system 目录 为什么要写这篇文章 1 因为最近在学习 软件调试 这本书 看到书中的某个调试历程中讲了Win
  • 分析常见数据结构在内存中的存储形式

    本文会在x64dbg中分析vector list map的内存存储特点 目录 分析vector在内存中的存储形式 x32dbg分析vector数组 总结一下vector的内存布局 分析 list 在内存中的存储形式 x32dbg分析 lis
  • 使用Clang作为编译器 —— Assembling a Complete Toolchain

    装配一个完整的工具链 1 介绍 2 工具 2 1 Clang 前端 2 2 其他语言的语言前端 2 3 汇编器 2 4 链接器 3 运行时库 3 1 编译器运行时 Compiler runtime 3 2 原子库 Atomics libra
  • Intel 80X86寄存器分类介绍

    开始读Linux内核相关书籍时 在书店里碰到一个计算机专业科班出身的朋友 向他请教时 他认为学习Linux内核不需要汇编和计算机体系结构等相关的知识 可是结合到现在的学习经历 我却越来越觉得为了搞清楚Linux内核相关设计和运行原理 自己那
  • LCD 驱动

    LCD的型号是 CM162 4 有U1 U2 外形尺寸 L W H mm 80 36 12 点数 mm 5 8 内藏控制器 SPLC 780 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 GND VDD VO
  • 汇编笔记

    更新于20190929 1 Intel和AT T汇编 参数是反的 AT T寄存器前加 常量前加 Intel mov rax rcx rcx gt rax mov cl 2 对应AT T movq rcx rax rcx gt rax mov
  • 逻辑左移、逻辑右移、算术左移、算术右移、循环左移、循环右移的学习

    逻辑左移时 最高位丢失 最低位补0 逻辑右移时 最高位补0 最低位丢失 算术左移时 依次左移一位 尾部补0 最高的符号位保持不变 算术右移时 依次右移一位 尾部丢失 符号位右移后 原位置上复制一个符号位 循环左移时 将最高位重新放置最低位
  • 探讨STOS指令

    转载在http hi baidu com darks00n blog item 4c019ec42ad0cdcad00060b1 html 下面是一段win32 console程序 Debug版 的反汇编代码 很程式化的东西 本文不讨论这段
  • 汇编符号语言

    CSDN话题挑战赛第1期 活动详情地址 第1期话题PK赛 参赛话题 汇编知识分享 话题描述 我们的计算机知识就像一座金字塔 底层是数学 上面是数字电路 然后是汇编 再往上是操作系统 网络 数据库 高级编程语言 框架等等 我们不可能精通这个金
  • push和pushl的区别

    AT T汇编中 命令中可以指定操作范围 如pushb是将一个byte压栈 而pushw就是将一个word压栈 同样pushl就是压栈long 也就是双字 esp指的是esp寄存器 已知是双字 而0xfffffff8 p 指的是一个内存空间
  • 汇编——寄存器的分类和功能

    在汇编中 个人感觉最重要的部分其实就是寄存器了 这次我们了解一下寄存器的分类和功能 先说一下寄存器是什么吧 其实就是一部分的空间 我们可以使用这些空间来存储内容 寄存器的空间都是16位的 80x86中 后来有增长 也就是1个字的空间 堆栈则
  • 第二章实验1

    周末没事正好练习下 前边 r原以为是只查看cpu寄存器内容 原来还有修改的意思 只用r即查询 用r 寄存器 则是修改该寄存器 不只是可以修改ax 可以修改其他寄存器 d 段地址 偏移地址 查看内存内容 最左边是每行的起始地址 中间是从指定内
  • 汇编宏伪指令介绍

    1 汇编宏伪指令介绍 macro macname macargs endm 1 macro 和 endm 表示宏定义的开始和结束 2 macro 后面接着宏定义的名字 然后是参数 参数后面的宏定义的实现 3 在宏定义中使用参数 需要添加前缀
  • 机器语言->汇编语言->高级语言

    在硬件层面来看 计算机的运行就是高底电压的变化 这种高低电压的变化在早期是通过开关或插拔电线来控制的 计算机中用0和1来表示低电压和高电压 这些0和1的序列就可以控制计算机CPU进行各种动作 一组一组的0 1序列就是一个一个的指令 这些指令
  • 汇编语言11之中断和int指令以及端口

    中断第处理外部突发事件的一个重要技术 硬件中断 外部中断 一般是外设发出的中断 内部中断 硬件出错或运算出错引起的中断 不可被屏蔽 软件中断 中断处理程序 CPU必须建立中断信息和中断处理程序之间的联系 中断信息中包含 1byte 中断类型
  • [培训-DSP快速入门-8]:C54x DSP汇编语言之寻址方式

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119023151 目录 第1章
  • BFD库

    BFD库 2011 01 16 11 16 22 分类 LINUX 什么是 BFD Binary format descriptor 即二进制文件格式描述符 它是连接工具 ld 和二进制文件操作工具 bin util 实现对于目标文件操作的
  • asm:常见指令大全

    常见指令大全 算数指令 INC 指令 DEC 指令 ADD 指令 SUB指令 MUL指令 IMUL指令 DIV指令 IDIV指令 逻辑指令 AND指令 OR指令 XOR 指令 TEST指令 NOT指令 交换指令 xchg 比较指令 CMP指
  • DOSBOX 快捷键及 MS-DOS 命令

    1 全屏 退出全屏 alt enter 2 释放鼠标 ctrl F10 3 exit 退出DOSBOX 4 dir 显示目录内容 可选参数 w 只显示文件名 P 显示部分内容 exe 筛选出可执行文件 5 cd 进入目录 cd 退回上一级目

随机推荐