当前位置: 首页 > article >正文

汇编实现从1加到1000(《X86汇编语言 从实模式到保护模式(第2版》) 第135页第2题解答)

题目:

编写一段主引导扇区程序,计算从1加到1000的和,并在屏幕上显示结果

输出结果:

代码:

jmp near start
text db '1+2+3+...+1000='
start:
      mov ax,0x07c0
      mov ds,ax     ;数据段从主引导区开始

      mov ax,0xb800
      mov es,ax     ;显存地址从B8000物理地址开始

      mov si,text   ;si指向text的第一个字符
      mov di,0
      mov cx,start-text
  s1:
      mov al,[si]
      mov [es:di],al ;保存字符
      inc di
      mov byte [es:di],0x07 ;保存字符属性:黑底白字
      inc si
      inc di
  loop s1 ;显示'1+2+3+...+1000='

      xor ax,ax
      xor dx,dx
      mov cx,1000
  s2:
      add ax,cx
      adc dx,0 ;dx=0+CF
  loop s2 ;累加1~1000,结果为dx:ax(dx高16位,ax低16位)
  ;此循环结束后,cx为0不用再次清零

      mov ss,cx ;设置栈的段地址
      mov sp,cx ;设置栈指针
      mov bx,10 ;设置除数

  s3:
      inc cx ;cx记录条件循环次数(数位+1)
      div bx ;(dx:ax)÷bx(为10)=ax......dx
      or dl,0x30 ;把数字转换为字符
      push dx ;余数进栈保存
      xor dx,dx ;dx清0准备下一次除
      cmp ax,0 ;商为0提前退出,提高效率
      jne s3


s4:
      pop dx
      mov [es:di],dl
      inc di
      mov byte [es:di],0x07
      inc di
  loop s4 ;显示各个数位,可参考s1循环

      jmp near $
      times 510-($-$$) db 0 ;填满至512字节
      db 0x55,0xaa ;结尾格式必须写

点我下载编译后产生的bin文件(写入主引导扇区后可在VirtualBox上运行)

具体怎么将bin文件写入主引导扇区见此文汇编语言在虚拟机中输出“Hello World!”

 注意事项:

1.s1循环中,最后一定要加inc di,否则新写入的数据会被覆盖!

2.s3循环中,一定是保存完dx后再为dx清零


http://www.kler.cn/news/311177.html

相关文章:

  • 【Kubernetes】常见面试题汇总(十三)
  • 学习ROS2第一天—新手笔记(humble版本)
  • 关于Redis
  • Mamba YOLO World
  • 集合是什么
  • 金手指设计
  • CefSharp_Vue交互(Element UI)_WinFormWeb应用(3)---通过页面锁屏和关机(含示例代码)
  • 新的突破,如何让AI与人类对话变得“顺滑”:Moshi背后的黑科技
  • 【Webpack--011】配置开发和生产模式的webpack.config.js
  • 【算法】滑动窗口—找所有字母异位词
  • 解决使用nvm ls命令没有出现*的问题
  • 华为OD机试 - 打印机队列 - 优先队列(Python/JS/C/C++ 2024 E卷 200分)
  • 【分立元件】案例:新人加了个TVS管为什么可能导致系统不能正常工作
  • 【Unity】URP Rendering总结
  • 【C++STL简介】——我与C++的不解之缘(八)
  • 【PyTorch】深入浅出PyTorch
  • 模版进阶(template)
  • Java项目: 基于SpringBoot+mybatis+maven洗衣店订单管理系统(含源码+数据库+开题报告+任务书+毕业论文)
  • 【Flink Flick CDC】学习笔记
  • 架构设计 - 常用日志收集方案选型对比与推荐
  • 【java面试每日五题之基础篇一】(仅个人理解)
  • ACL 2024:交叉领域情感分析——论文阅读笔记
  • Kotlin cancel CoroutineScope.launch的任务后仍运行
  • PDF标准详解(五)——图形状态
  • 104. 二叉树的最大深度【 力扣(LeetCode) 】
  • VIM使用技巧
  • 从openAI最新模型GPT-o1再谈思维链(Cot)技术,大模型该怎么提升其逻辑推理能力?
  • 在 pika.SelectConnection 和 gevent 中实现高效异步:事件驱动与协程模型的冲突与优化
  • linux入门到实操-2 linux桌面、终端基本操作,文件系统、目录结构、挂载点
  • [数据集][目标检测]车窗状态检测车窗开关检测数据集VOC+YOLO格式299张3类别