博客
关于我
学汇编,记笔记(四)_《汇编语言(第4版)》王爽著——[BX]和loop
阅读量:793 次
发布时间:2019-03-25

本文共 1672 字,大约阅读时间需要 5 分钟。

前言

bloquefxnxiazaiFOX《汇编语言(第4版)》王爽著。本笔记是课本内容+自我整理,便于查阅与复习。支持原著。

约定符号

[0]表示偏移地址为0的内存单元,有自适应功能: - `mov ax, [0]`:将字单元[0]和[1]拷贝到ax - `mov al, [0]`:将字节单元[0]拷贝到al

同理,[bx]表示偏移地址为bx的内存单元,此时偏移空间存在bx内。

注意:只有bx、bp、si、di四个寄存器可用[]形式寻址。

  • (bx)表示bx存储的内容,可以是寄存器(ax)、段寄存器+偏移地址((ds)*16+(bx))或内存单元(10000H)。
  • (2000:0)等错误用法需统一,前后保持一致。

idata表示任意常量,可取1, 2, 3, ...。

文章目录

(此处目录格式暂空)

一、loop 指令

loop指令用于循环操作,循环次数由寄存器cx存储。格式为`loop 标号`,循环入口需标注。

例如:

assume cs:calcal segment  mov ax, 1  mov cx, 2  ;循环体  s: add ax, ax  loop s  ;返回值  mov ax, 4c00h  int 21h  test ends end

loop指令执行步骤:(cx)-=1,判断cx是否为0。不为0则转至标号位置执行,否则继续下行。

实验:123 × 236 加法循环计算

累加123个236即得结果。 ```asm assume cs:calcal segment mov ax, 0 mov cx, 123 s: add ax, 236 loop s mov ax, 4c00h int 21h cal ends end ```

二、遍历连续内存单元

要遍历FFFF:0~FFFF:B内存单元(共十二个单元),可以用循环代替繁琐的add语句。 注意:内存单元以字节为单位,ax为十六位寄存器,存储单元长度与寄存器位数不同,需分别设置高字节和低字节。 - ah需初始化为0,al则设置为FFFF:[bx]。 - 汇编源程序中数据不能以字母开头,FFFF需写成0FFFFH。

代码示例:

assume cs:ffff0_12 segment  mov ax, 0FFFFh  mov ds, ax  mov bx, 0  mov cx, 12  mov dx, 0  s: mov al, [bx]     mov ah, 0     add dx, ax     inc bx  loop s  mov ax, 4c00h  int 21h  ffff0_12 ends end

三、Debug.exe与MASM 的区别

对于`mov ax, [0]`,MASM会优化为`mov ax, 0`,而Debug.exe会解释为`mov ax, ds:0`。 为避免歧义,建议加上段前缀: - `mov al, ds:[0]` 对应al = (ds)*16 + 0 - `mov al, [bx]` 对应al = (ds)*16 + bx

四、段前缀的使用

为了明确偏移地址的来源,建议在所有偏移地址处加上段前缀: - `mov ax, ds:[bx/0]` - `mov ax, cs:[bx/0]` - `mov ax, ss:[bx/0]` - `mov ax, es:[bx/0]`

五、安全的内存使用

在PC机DOS模式下,安全的空闲内存区间为00200H~002FFH,共256字节。操作前请用Debug查询空闲内存,确保全为0后再使用。

六、Debug 调试loop

- `g (偏移地址)`:跳转至指定行运行,断点在该行之前的代码。 - `p`:执行一次loop循环,需先跳转至loop行。

后记:

  • 节目中发现段名不能命名为test(疑问)。
  • loop原理:cx减一后检查是否为0。循环次数由cx存储。
  • 良好习惯:段前缀的使用。
  • 避免随意写入内存。
  • 内存单元至寄存器需分段赋值以避免进位丢失。

转载地址:http://yvpuk.baihongyu.com/

你可能感兴趣的文章
Mysql学习总结(68)——MYSQL统计每天、每周、每月、每年数据 SQL 总结
查看>>
Mysql学习总结(69)——Mysql EXPLAIN 命令使用总结
查看>>
Mysql学习总结(6)——MySql之ALTER命令用法详细解读
查看>>
Mysql学习总结(70)——MySQL 优化实施方案
查看>>
Mysql学习总结(71)——MySQL 重复记录查询与删除总结
查看>>
Mysql学习总结(71)——数据库介绍(MySQL安装 体系结构、基本管理)再回顾
查看>>
Mysql学习总结(73)——MySQL 查询A表存在B表不存在的数据SQL总结
查看>>
Mysql学习总结(76)——MySQL执行计划(explain)结果含义总结
查看>>
Mysql学习总结(77)——温故Mysql数据库开发核心原则与规范
查看>>
Mysql学习总结(78)——MySQL各版本差异整理
查看>>
Mysql学习总结(79)——MySQL常用函数总结
查看>>
Mysql学习总结(7)——MySql索引原理与使用大全
查看>>
Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
查看>>
Mysql学习总结(81)——为什么MySQL不推荐使用uuid或者雪花id作为主键?
查看>>
Mysql学习总结(82)——MySQL逻辑删除与数据库唯一性约束如何解决?
查看>>
Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结
查看>>
Mysql学习总结(84)—— Mysql的主从复制延迟问题总结
查看>>
Mysql学习总结(85)——开发人员最应该明白的数据库设计原则
查看>>
Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
查看>>
Mysql学习总结(9)——MySql视图原理讲解与使用大全
查看>>