实验

  1. 综合使用 loop[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个字单元重复填充字数据 0403H
  • 以下为示例程序:

    assume cs:code					# 1
    code segment # 2
    mov ax, 0b800h # 3 ; 数据必须以数字开头,要在字母前补 0
    mov ds, ax # 4
    mov cx, 16 # 5 ; 设置循环次数为 16
    mov bx, 07b8h # 6
    # 7
    S: mov [bx], word ptr 0403h # 8 ; 将字数据 0403h 送向偏移地址
    inc bx # 9 ; 字数据占 2 个内存单元 bx 自增两次
    inc bx # 10
    loop s # 11
    # 12
    mov ax, 4c00h # 13
    int 21h # 14
    code ends # 15
    end # 16
  • 编译、连接和运行结果如下图所示:

  • 将源代码程序中字数据 0403H 修改为 0441H,再次运行的结果如下:

    结论与实验 3 是一致的,b8000 开始的一块内存与显示有关,且修改的字数据的前两位和颜色有关,后两位是字符的 ASCII 码值。

  1. 综合使用 loop[bx],编写完整汇编源程序,实现向内存 0:2000:23F 依次传送数据 063(3FH)
  • 使用 loop[bx]mov实现

    • 以下为示例程序:
    assume cs:code					# 1
    code segment # 2
    mov ax, 0020h # 3
    mov ds, ax # 4
    mov cx, 64 # 5 ; 设置循环次数为 64
    mov bx, 0 # 6
    # 7
    S: mov [bx], bl # 8 ; 将字节数据送向偏移地址
    inc bx # 10
    loop s # 11
    # 12
    mov ax, 4c00h # 13
    int 21h # 14
    code ends # 15
    end # 16
    • 编译、连接如下图所示:

    • g 命令执行程序,并用 d 命令显示内存中的内容,如下图所示:

    结果很明显。还有,这里因为数据不大于 255 所以传送字节数据。

  • 还可以利用栈的特性,使用 looppush 实现

    • 以下为示例程序:
    assume cs:code					# 1
    code segment # 2
    mov ax, 0020h # 3
    mov ss, ax # 4 ; 根据之前的实验得,在修改 ss 时一并执行
    mov sp, 0040h # 5 ; 下一条指令,下一条指令一般是修改 sp 的值
    mov bx, 3f3eh # 6 ; 由于栈是对字数据操作,不得不将 2 个内存
    # 7 ; 单元的值一起写入 16 位寄存器
    mov cx, 32 # 8 ; 对字数据操作,循环 32 次
    # 9
    s: push bx # 10 ; 压栈时栈顶指针上移 2 个单位 (sp - 2)
    sub bl, 2 # 11
    sub bh, 2 # 12
    loop s # 13
    # 14
    mov ax, 4c00h # 15
    int 21h # 16
    code ends # 17
    end # 18
    • 编译、连接如下图所示:

    • 重复上次实验的操作,如下图所示:

    根据压栈的特性,需要先压入高地址单元的内存,所以是按从 3f0 的顺序压入。

  1. 下面的程序的功能是将 mov ax, 4c00h 之前的指令复制到内存 0:200 处,补全程序并调试。
assume cs:code						# 1
code segment # 2
mov ax, __ # 3
mov ds, ax # 4
mov ax, 0020h # 5
mov es, ax # 6
mov bx, 0 # 7
mov cx, __ # 8
# 9
s: mov al, [bx] # 10
mov es:[bx], al # 11
inc bx # 12
loop s # 13
# 14
mov ax, 4c00h # 15
int 21h # 16
code ends # 17
end # 18

指令执行是因为 cs:ip 指向了它,cs 就是指令的段地址,我们只需要把指令的段地址交给数据段就能直接通过 [bx] 来获取内存中的内容了。所以 # 3 行的空格填 cs

由于不确定指令占用多少字节,现在将 cx 的值设为 0 并编译、连接,如下图所示:

使用 debug 中的 u 命令反汇编,查看指令占用了多少内存,如下图所示:

可见 mov ax, 4c00h 之前的命令占用 1e87:0000 1e87:001517h 个字节。

由此可得,共循环 17h 次,因此 # 8 行的空格填 17h,并将 cx 的值设置为 17h,重新编译、连接和反汇编,如下图所示:

确认无误后,使用 g 命令运行,并使用 d 命令查看结果,如下图所示:

可见已成功将 mov ax, 4c00h 之前的指令复制到指定内存。

尾巴

这次没有什么好说的,那就简单说一下在实验时可能遇到的问题:

  • debug 中的 mov ax, [0] 与程序中的 mov ax, [0] 是不同的,程序中的会被编译器当作 mov ax, 0, 解决方法有两种 mov bx, 0 mov ax, [bx] 或者是 mov ax, ds:[0]
  • 程序中所有数据不能以字母开头,如果是字母开头的 16 进制数,需要在前面补 0。
  • 栈只能对字数据进行操作,有时需要对操作数据做一些转换。

实验4 —— [bx]和loop的使用的更多相关文章

  1. 实验4 [BX]和loop指令

    实验内容: 1.综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0441H. 实验结果: 若填充的数据为:0403h,则实验结果转变为: ...

  2. 【实验四】[bx]和loop的使用

    四.实验结论 任务一: (1) ①当我写 mov ax,b800h时,编译报错了. ②清屏后运行 (2)将源代码程序中字数据0403H→修改为0441H,再次运行,图案发生了变化. 任务二: (1) ...

  3. 汇编语言_实验四_[bx]和loop的使用

    四.实验结论 1.       实验内容1 (1)源代码: assume cs:code code segment mov ax,0b800h mov ds,ax mov bx,07b8h mov c ...

  4. 汇编语言-[BX]和loop指令

    汇编语言-[BX]和loop指令 [BX]指令介绍 mov ax,[bx] 功能: bx为偏移地址,段地址默认为ds.因此,上面指令作用就是将ax中的数据送入内存ds:bx处,即:((ds)*16 + ...

  5. 汇编学习笔记(3)[bx]和loop

    本文是<汇编语言>一书的学习笔记,对应书中的4-6章. 汇编程序的执行 要想将源代码变为可执行的程序需经过编译.连接两个步骤,WIN7操作系统下需要MASM程序来进行编译连接工作.将MAS ...

  6. [汇编学习笔记][第五章[BX]和loop指令]

    第五章[BX]和loop指令 前言 定义描述性符号“()”来表示一个寄存器或一个内存单元的内容,比如: (ax)表示ax中的内容,(al)表示al的内容. 约定符号ideta表示常量. 5.1 [BX ...

  7. 80806汇编(5)——[BX]和Loop指令

    80806汇编(5)--[BX]和Loop指令 已经好久没写点东西了,国庆节就一直想弄个个人网站,这段时间一直在弄那个,虽然有现成的框架(Hexo),但是总想弄出自己的效果来,但是最后还是有些差强人意 ...

  8. 小甲鱼零基础汇编语言学习笔记第五章之[BX]和loop指令

         这一章主要介绍什么是[BX]以及loop(循环)指令怎么使用,loop和[BX]又怎么样相结合,段前缀又是什么鬼,以及如何使用段前缀.   1.[BX]的概念      [BX]和[0]类似 ...

  9. 王爽汇编第五章,[bx]和loop指令

    目录 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 例子: 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 [bx]之前我们介绍寄存器的时候,已经很详细的说明过了,b ...

随机推荐

  1. Redis 基础特性讲解

    目录 1.Redis基础杂项小节 1.是什么 2.能干嘛 3.去哪下 4.Redis启动后基础知识讲解 2.Redis数据类型 1.常用的五大数据类型 2.高级'玩家'才知道的其他数据类型 3.Red ...

  2. 微服务实践分享(2)api网关

    1.作用[http://chuansong.me/n/465796751848]: 一个完整的.「面向接入」的API GW需要包含以下功能: 面向运行期 对客户端实现身份认证 通信会话的秘钥协商,报文 ...

  3. rabbitmq 不发送ack消息如何处理:rabbitmq可靠发送的自动重试机制

    转载地址:http://www.jianshu.com/p/6579e48d18ae http://www.jianshu.com/p/4112d78a8753 接这篇 在上文中,主要实现了可靠模式的 ...

  4. 《C#高效编程》读书笔记01-使用属性而不是可访问的数据成员

    在需求变更中,属性比数据成员更容易修改,例:客户对象不该与空白名称,若你使用公有属性封装Name,那么现在修改一处,而数据成员则可能要修改多处 public class Customer { priv ...

  5. 编译安装php容易出现的问题以及解决办法

    http://crybit.com/20-common-php-compilation-errors-and-fix-unix/

  6. 小米OJ刷题日志

    虽然这OJ上的题比较水,但还是挺有意思的.关键是能赚钱 特别是提交方式 居然不支持C++,垃圾OJ 4. 最长连续数列 排序后dp 5. 找出旋转有序数列的中间值 写个排序就做完了. 6. 交叉队列 ...

  7. web常见几种处理图标方法

    方法一: 用background制作小图标 像这样,拿到设计稿后把所有的图标放在一张图片上,利用background-position.width.height来控制图标的位置及大小. 代码: .ic ...

  8. hive中select中DISTINCT的技巧和使用

    hive中select中DISTINCT的技巧和使用 单表的唯一查询用:distinct 多表的唯一查询用:group by 在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mysql提供 ...

  9. GreenDao 3.x 注解中ToOne和ToMany的个人理解

    GreenDao是什么东西这个就不用多说了.自从GreenDao升级到3.0之后,编译的方法发生了改变.当然这个改变是有助于快速开发的. 区别在哪随便百度一下都可以知道.这里就不多说了. 这里主要说的 ...

  10. LINQ新添知识

    linquser.ExecuteCommand("TRUNCATE TABLE Board");       linquser.ExecuteCommand("DELET ...