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

题目:

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

输出结果:

代码:

TypeScript 复制代码
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清零

相关推荐
陈eaten1 天前
汇编使用AES指令集实现AES解密
汇编·python·aes解密·aes指令集
顾鉴行思1 天前
10 字符串常量到底存在哪里?
c语言·汇编·经验分享
iCxhust2 天前
在 emu8086 中可以直接编译运行的完整汇编程序,演示数组的定义、遍历、求和、求最大值。
开发语言·前端·javascript·汇编·单片机·嵌入式硬件·算法
浩浩测试一下2 天前
堆栈中的 参数与局部变量 (逆向分析)
汇编·逆向·免杀·堆栈·windows编程·pe壳
iCxhust2 天前
微机原理实践教程(C语言篇)---A001闪烁灯
c语言·开发语言·汇编·单片机·嵌入式硬件·51单片机·微机原理
浩浩测试一下4 天前
抬栈 恢复上下文 (逆向分析)
汇编·逆向·堆栈·windows核心编程
zhouwy1134 天前
ARM汇编指令集详解
汇编·arm开发
iCxhust4 天前
微机原理实践教程(汇编篇)---A002流水灯
汇编·单片机·嵌入式硬件·51单片机·微机原理
浩浩测试一下4 天前
栈帧 抬栈与平栈 (逆向分析)
汇编·windows api·堆栈·windows编程·windows 开发
陈eaten4 天前
win11下nasm编写汇编及链接方案
汇编·链接·nasm·gcc·golink