实验

  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. 使用cp命令拷贝目录下指定文件外的其他文件

    shopt -s extglob cp test/!(abc*) test2/ cp test目录下除了以abc开头的其他文件 如果是除去多个文件的话使用   !(a|b)   ;   注意不要多加空 ...

  2. Array.isArray() 和 isObject() 原生js实现

    function isObject(val) { return val != null && typeof val === 'object' && Array.isAr ...

  3. Flat UI theme--扁平化的UI

    项目地址:点击打开 支持版本: jQuery Mobile 1.3.2 使用很简单,前提是你的前端是在jquery-mobile的基础上开发的,然后导入相应的css文件.img文件和js文件即可. 案 ...

  4. linux-2.6.22.6/Makefile:416: *** mixed implicit and normal rules: deprecated syntax

    今天在按照韦东山大哥的教程流程编译内核的时候出现了这个问题      linux-2.6.22.6/Makefile:416: *** mixed implicit and normal rules: ...

  5. SpringBoot:异步开发之异步调用

    前言 除了异步请求,一般上我们用的比较多的应该是异步调用.通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的.比如记录日志信息等业务.这个时候正常就是启一个新线程去做一些业务处理,让主线 ...

  6. Java中protected方法访问权限的问题

    先看Test.java 此时出现上文提到的错误:The method clone from the type Object is not visiuable. 我们已经清楚Object.clone() ...

  7. Nginx FastCGI PHP

    We can see this comment in nginx.conf. # pass the PHP scripts to FastCGI server listening on 127.0.0 ...

  8. 如何处理错误消息Please install the gcc make perl packages

    如何处理这行错误消息? Please install the gcc make perl packages from your distribution. 执行命令行:yum install gcc ...

  9. ABAP和Java单例模式的攻防

    ABAP CLASS zcl_jerry_singleton DEFINITION PUBLIC FINAL CREATE PRIVATE . PUBLIC SECTION. INTERFACES i ...

  10. Oracle RAC/Clusterware 多种心跳heartbeat机制介绍 RAC超时机制分析

    ORACLE RAC中最主要存在2种clusterware集群件心跳 &  RAC超时机制分析: 1.Network Heartbeat 网络心跳 每秒发生一次: 10.2.0.4以后网络心跳 ...