
汇编 第五章 【bx】和loop指令
它的偏移地址在bx中,取字还是取字节取决于寄存器是8位还是16位。 判断cx中的值: 启动循环前, 循环执行的程序段应放在标号和 示例:计算
12个8位数据相加,结果可能超过8位,需使用16位寄存器存储。 解决方法: 示例:将
发布日期:2021-05-10 04:21:22
浏览次数:19
分类:精选文章
本文共 1579 字,大约阅读时间需要 5 分钟。
第五章 【bx】和loop指令
5.1 [bx]
在debug中使用mov ax,[0]
:代表的是偏移地址,而在asm文件中写的编译后却变成了数字mov ax,0
,相当于把0给了ax,而不是ds:0
,所以出现了[bx]。要写成这样才能实现:mov ax,ds:[0]
。
关键点:
[0]
表示内存单元,偏移地址为0;[bx]同样表示内存单元,段地址在DS中。inc
指令相当于C语言中的++
运算符。5.2 Loop指令
介绍
这个指令与循环有关。
指令格式:loop 标号
执行loop
指令时,CPU进行以下两步操作:
cx = cx - 1
- 若不为零,转至标号处执行程序。
- 若为零,则向下执行。
常用场景
- **cx中的存放:**通常用于存放循环的次数。
- **标号:**在汇编中,标号代表地址,标号处的代码将被重复执行。
三个关键要点
cx
中存放循环次数。loop
指令的标号所标识的位置必须在代码块前面。loop
指令之间。代码框架
mov cx, 循环次数S: 循环执行的代码...loop S
5.3 Debug跟踪与Loop指令
注意事项在Debug中跟踪循环程序
- 在汇编中,数据不能以字母开头。如果需要输入类似
FFFFH
的数值,需在前面加0,否则编译会报错。 - 使用
G
和P
命令进行调试:G
命令(无参数):强制执行到程序结束。G
命令(有参数):执行到指定IP地址停止。P
命令:单步执行或跳过指令。
5.4 Masm和Debug的区别
-
Debug:
mov ax,[0]
直接访问偏移地址为0的内存单元。
-
Masm编译器:
mov ax,0
会编译成
mov ax,0
,相当于mov ax, ds:0
。 -
解决方法:
- 使用
mov ax,ds:[0]
。 - 也可以使用
bx
临时寄存器:mov bx,0mov ax,[bx]
5.5 Loop和[bx]的联合应用
示例:计算ffff:0
到ffff:b
内存单元中数据之和,存储在dx
中
- 将8位数据先转换为16位,再进行汇总。
Optimize的代码
codesgmov ax,0ffffhmov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,0ch ;循环次数s: mov dl,[bx] mov es,[bx],dl inc bx loop s mov ax,4c00h int 21hcodesg endsend
5.6 段前缀
概念
- 指令
mov ax,[bx]
中,默认使用ds
段前缀。 - 可以显式指定段地址:
mov ax,ds:[0]
这里的
ds
就是段前缀。
5.7 安全内存空间
原因
8086模式下,随意写入内存空间存在风险,因为这可能覆盖系统数据或代码。
安全区域
- 在PC机中,范围
0:200h
到0:2FFh
安全可用,因为它们都为空,且不会被系统或程序占用。
5.8 段前缀的优化使用
示例:将ffff:0
到ffff:b
内存单元中的数据复制到0:200
到0:20b
内存单元
优化后的代码:
codesgmov ax,0ffffhmov ds,axmov ax,0020hmov es,axmov bx,0mov cx,12s:mov dl,[bx]mov es,[bx],dlinc bxloop smov ax,4c00hint 21hcodesg endsend
优化说明
- 使用
es
存放目标段地址0020h
,ds
存放源段地址0ffffh
。 - 只在循环中设置一次
es
,大幅提高效率。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年05月02日 03时07分36秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
启动MongoDB出现1053错误
2019-03-13
能解决数据可视化大屏需求的3款可视化工具
2019-03-13
欢迎来到小迪博客
2019-03-13
【Altium Designer21】工作栏中文解析
2019-03-13
[87]用secureCRT连接虚拟机中的Ubuntu系统,出现“远程主机拒绝连接”错误
2019-03-13
Shell脚本防DNS攻击检测并删除肉机IP
2019-03-13
如何在VSCode中定制JSON的IntelliSense
2019-03-13
椭圆曲线的定义
2019-03-13
多代理区块链框架客户端的操作
2019-03-13
RSA操作中的公钥和私钥的生成
2019-03-13
go语言中类的继承和方法的使用
2019-03-13
caffe训练的时候遇到的text-format 错误解决方案。
2019-03-13
Java 8新特性(一):Lambda表达式
2019-03-13
Little Zu Chongzhi's Triangles
2019-03-13
Train Problem II(卡特兰数+大数乘除)
2019-03-13
一些技术博客
2019-03-13
第01问:MySQL 一次 insert 刷几次盘?
2019-03-13
分布式 | DBLE 3.20.07.0 来啦!
2019-03-13
振荡器指标
2019-03-13
libvirtd:内部错误:Failed to apply firewall rule
2019-03-13