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

汇编语言[王爽]-05 [BX]和loop指令

loop指令实现循环

执行过程:

①(cx)=(cx)-1

②判断 cx 中的值,不为零则转至标号处执行程序,如果为零则向下执行。

例:计算2^12

assume cs:codesegcodeseg segmentmov ax,2#-------做11次add ax,ax----------mov cx,11
s:add ax,axloop s#--------------------------------mov ax,4c00hint 21hcodeseg ends
end

框架

	mov cx,循环次数
s:循环的程序段loop s

考虑这么一个问题:计算ffff:0006单元中的数乘以3,结果储存在dx中

分析:

  1. 结果不能储存在一个8位的寄存器中,存在越界的可能,存在16位的寄存器中显然则不会越界,所以需要存在dx中而不是dl或者dh
  2. 基本思路:dx=0,把(ffff:0006)中的字节型数据放入ax中,执行三次add dx,ax
  3. 八位的内存单元如何给16位的ax赋值? 令(ah)=0,赋值给al
assume cs:code
code segmentmov ax,0ffffhmov ds,axmov bx,6hmov ah,0mov al,[bx]mov dx,0mov cx,3
s:add dx,axloop smov ax,4c00hint 21h
code ends
end

当写入 mov al,[dx] 时,编译器报错

Untitled

debug调试循环的方式

g ip地址 : 直接执行到某条指令

p : 可以用来结束int 21h,也可以用来跳过循环

注:debug调试程序时,文件名要带上后缀 -debug p.exe

Debug和汇编编译器masm对指令的不同处理

mov ax,[0]

Debug解释为 mov ax,((ds)*16+0)

masm解释为 mov ax,0

所以在masm要写为

# 显示指明段前缀
mov ax,ds:[0]# 用寄存器
mov bx,0
mov ax,[bx]

loop 和 [bx]的联合运用

考虑这样一个问题,计算ffff:0 ~ ffff:b 单元中的数据的和,结果储存在bx中

8位数据存入al,以ax为中转赋值给bx【bx不会越界进位】

assume cs:code
code segmentmov ax,0ffffhmov ds,axmov bx,0	;初始化ds:bx指向ffff:0mov dx,0	;初始化累加器dx, (dx)=0mov cx,12	;初始化循环计数寄存器cx
s:mov ah,0mov al,ds:[bx]	;ax为中介传递数据add dx,axinc bx			;ds:bx指向下一个元素loop smov ax,4c00hint 21h
code ends
end

一段安全的空间

assume cs:code
code segmentmov ax,0mov ds,axmov ds:[26h],axmov ax,4c00hint 21h
code ends
end

执行上述的程序,系统会死机

因为在实模式下,我们可以自由地操纵真实的硬件;

在保护模式下,则是在操作系统的保护下,无法操纵真实的硬件

所以在实模式下编程时,要使用安全的内存空间

一般是 0:200 ~ 0:2ff 这256字节的空间

段前缀的使用

考虑一个问题,把内存ffff:0 ~ ffff:b中的数据复制到 0:200 ~ 0:20b中

assume cs:code
code segment;设置两个段前缀mov ax,0ffffhmov ds,axmov ax,20hmov es,axmov bx,0mov cx,12
s:mov dl,ds:[bx]mov es:[bx],dlinc bxloop smov ax,4c00hint 21h
code ends
end

为什么要使用 dl 而不是 mov es:[bx], ds:[bx]

因为 直接mov的话,没有指定内存大小,会报错

Untitled

其实可以用 dx 但是那样的话 bx就不是 inc 而是 add bx,2

实验四 [bx]和loop的使用

第四章 第一个程序

http://www.wxhsa.cn/company.asp?id=4750

相关文章:

  • 完整教程:YOLO数据集格式转换工具v1.0-微智启软件工作室
  • 2.docker 安装
  • 树形DP2F
  • 搞定SPI开发:硬件设计精讲与CH390H示例应用
  • Qt-摄像头捕获画面
  • 我开发的软件和开源/免费软件
  • PostgreSQL中级认证,PG证书官网查询
  • LLaMA-Adapter - 详解
  • 查看安装软件版本的命令
  • ubuntu 20.04安装mysql 5.7
  • 企业微信逆向开发协议,ipad协议调用方式
  • OpenStack Nova Scheduler 计算节点选择机制
  • 记一种很新的 bitset
  • 基于yolo12进行深度学习的机动车车牌检测
  • 有向图强连通分量
  • Kafka 消费者元数据topicId变化问题
  • 【SPIE出版】第五届生物医学与生物信息工程国际学术会议(ICBBE 2025)
  • Qoder 全新「上下文压缩」功能正式上线,省 Credits !
  • journald 持久化 + 限额脚本
  • 【2025-09-14】连岳摘抄
  • 深入解析:PAT乙级_1125 子串与子列_Python_AC解法_含疑难点
  • ESP32-S3 与GPS北斗通信返回定位/海拔/速度数据的测试代码
  • GZY.Quartz.MUI(基于Quartz的UI可视化操作组件) 2.8.0发布 新增仪表盘和检索功能
  • AIGEO助力企业破局
  • 东南大学数据库课程06-Database Design
  • MacOS升级15.2后的问题(二):无法修改mac网络地址
  • 东南大学数据库课程07-Distributed Database Systems
  • HCIA——VLAN间通信
  • Xdebug安装与PhpStorm调试配置
  • vue - 内置指令