实验 4 [bx]和 loop 的使用

一、实验目的

1. 理解和掌握寄存器间接寻址方式[bx]

2.  通过汇编指令 loop 的使用理解编程语言中循环的本质

3.  熟练掌握使用 debug 按需调试完整汇编源程序的方法

二、实验准备

1. 学习/复习第 5 章使用[bx]和 loop 实现循环的编程应用示例(教材 5.5 节,5.8 节)

2.  复习第 3 章「栈」的知识

3.  结合第 4 章课件,复习完整汇编源程序编写→汇编→连接→运行→调试的方法

三、实验内容

1.  综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个

字单元重复填充字数据 0403H

必做:综合使用 loop, [bx], mov 实现

实现代码如下:

assume cs:code
code segment
    mov ax,0b800h
    mov ds,ax
    mov cx,16
    mov bx,07b8H
    mov ax,0403h

s:  mov [bx],al
    inc bx
    mov [bx],ah
    inc bx
    loop s
    mov ax,4c00h
    int 21h
code ends
end 

首先当然是设置bx和ds的值,将b800通过ax传给ds(由于b800是以字母开头的,所以应当在前面加上一个0),bx的值设为07b8h.

最后将ax的值设为0403h,用于累加

这里要加16次,显然要使用loop循环,设置cx的值等于16以控制循环次数,用inc bx每次bx地址加1

一个字单元是16位的,采用小端法读字

实验结果如下:

这里仍然使用了上一个实验中所使用的process.bat简化步骤,可以看出输出结果是一串红心

2.  综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据

0~63(3FH)。

代码如下:

assume cs:code
code segment
        mov ax,20h
        mov ds,ax
        mov bx,0
        mov cx,64

	s:mov [bx],bx
        inc bx
        loop s

        mov ax,4c00h
        int 21h
code ends
end 

首先逻辑地址0:200可以写成20:0,这样改写是为了便于后面bx递增,通过ax将20h传入到ds中。

bx初值赋为0,一共需要执行64次,将cx的值赋为64以控制循环次数

刚好这里需要传送的数据0~63(3FH)与[bx]是一致的,数据0-63是64个连续的数字,0-3fH也是连续的64个编号。

我们可以使用一个bx变量就把偏移地址和数字的递增都搞定。

所以循环段内容就写成了如上的样子

实验结果如下:

似乎没有什么变化和输出,仿照前面实验的经验,我们将屏幕清空后再次执行

依然没有发现有任何的输出结果,当然这个程序是执行了的,猜测可能改程序没有输出,只是在内部内存中发生了一些变化。

  

3.  教材实验 4(3)(P121)

分析过程:

cs段寄存器中存储的是指向程序代码段的段地址。此实验是将程序的代码(按字节)复制,故将cs寄存器中的指向代码的段地址赋值给ax,再通过ax寄存器赋值给ds段寄存器。

所以显然第一个空应当填写CS

对于第二个空,我们需要填写CX的值,即需要知道循环的次数,这是重点,此试验是将"mov ax,4c00h"之前的指令复制到内存0:200处

所以没有执行前我们不知道次数,索性先随便输入一个CX值,反汇编看出"mov ax,4c00h"之前的机器码长度

这里我们随机输了个10,代码如下

assume cs:code
code segment
    mov ax,cs
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,10    

    s:mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s

    mov ax,4c00H
    int 21H
code ends
end

  

 

Debug后查看和反汇编的内容如上

CX的值为1C,即整个代码长度

我们发现mov ax,4cooh/int 21h它们共占用了5个字节。所以在本实验中我们需要复制的代码字节数是001CH-0005H=0017H==23个字节,故cx计数寄存器赋值为23或17H。

故正确的代码如下

assume cs:code
code segment
    mov ax,cs
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,17h    

    s:mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s

    mov ax,4c00H
    int 21H
code ends
end

成功编译连接后,我们进入Debug,对0020:0(即0:200)处,长度为17h的内存进行反汇编,查看其中的内容

经查看发现确实是mov ax,4c00h"之前的指令复制到内存0:200处,实验成功!!!

五、总结与体会

(1)不仅可以向内存中写入数据,还可以复制代码

(2)在必须执行过一次才能知道结果的情况下,我们可以先假设再得出准确的数值

(3)loop的作用很大,极大的减少不必要的重复操作

原文地址:https://www.cnblogs.com/mr-gao1/p/9974524.html

时间: 2024-10-30 10:20:24

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

汇编实验肆 [bx]和loop的使用

南京信息工程大学实验报告 实验名称   实验 4 [bx]和loop的使用 实验日期      11.25 得分 学院   计软院 专业   计科 年级   2017级 班次   6班级 姓名   江轲禹 学号   20171308227 一.实验目的 1. 理解和掌握寄存器间接寻址方式[bx] 2. 通过汇编指令loop的使用理解编程语言中循环的本质 3. 熟练掌握使用debug按需调试完整汇编源程序的方法 二.实验准备 1. 学习/复习第 5章使用[bx]和loop实现循环的编程应用示例(教

实验 四 [bx]和loop的使用

1. 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据0403H. 代码  assume cs:code code segment mov ax,0b800h mov ds,ax mov bx,07b8h mov cx,16 s:mov [bx],0403h add bx,2 loop s mov ax ,4c00h int 21hcode endsend 2. 综合使用 loop,[bx],编写完整汇编源程序,实现向内存

实验四 [bx]和 loop 的使用

一: 1. 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据 0403H. 代码如下: assume cs:code code segment mov ax,0b800h mov ds,ax mov cx,16 mov bx,07b8H mov ax,0403h s: mov [bx],al inc bx mov [bx],ah inc bx loop s mov ax,4c00h int 21h code ends en

实验 4 [bx]和loop的使用

一.实验结论 1.实验内容1 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据0403H. (1)代码如下: assume cs:codecode segment mov ax,0b800h     mov ds,ax     mov ax,0403h     mov bx,07b8h     mov cx,16s:mov [bx],ax  inc bx  inc bx  loop s  mov ax,4c00h  int

实验4 [bx]和loop的使用

1. 综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8 开始的连续16 个 字单元重复填充字数据0403H. 在Masm集成环境中写入代码保存为1116.asm文件如下: 编译运行生成如下文件: 成功运行得到如下结果: 用debug调试查看b800:0728后的16个字单元的内容,成功改写,截图如下: 将数据0403h改写成0441h,编译运行得到如下截图: 结论:观察到改变填充内容,输出字符形状产生了变化,且是根据各数值对应的ASCII码及相应形状而发生改变. 通过改

实验四 [bx]和loop的使用

1. 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据0403H. 代码如下: 对他进行连接执行,出现了红心. 2. 综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据 0~63(3FH). 写出程序,执行用d命令查看 3. 教材实验4(3)(P121) 使用r命令显示寄存器状态,显示程序所占字节数 cx=001c; 使用u命令,求出需要复制的机器码的字节数 001cH-00

实验四 [BX]和loop指令

一.练习1 编写完整汇编源程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0430h. 源程序如下: 运行结果如下: 二.练习2 综合使用loop和[bx],编写完整汇编源程序,实现向内存0:200~0:23f依次传送数据0~63(3FH). 源程序代码如下: assume cs:code code segment mov ax,00020h mov ds,ax mov bx,0 mov cx,64 s: mov [bx],bx inc bx loop s mov ax,4

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

这一章主要介绍什么是[BX]以及loop(循环)指令怎么使用,loop和[BX]又怎么样相结合,段前缀又是什么鬼,以及如何使用段前缀. 1.[BX]的概念 [BX]和[0]类似,[0]表示内存单元的偏移地址是0.要完整描述一个内存单元,需要两种信息:内存单元的地址,内存单元的长度(类型).[BX]同样也表示一个内存单元,它的偏移地址在bx中,比如指令:mov ax,[bx].这里我们以一个程序为例: 1 assume cs:codesg 2 codesg segment 3 start: mov

汇编入门学习笔记 (四)—— [BX] 和 loop指令

疯狂的暑假学习之  汇编入门学习笔记 (四)-- [BX]  和 loop指令 参考:<汇编语言> 王爽 第5章 1.[BX] mov al,[1] 在debug中,会把bs:1 中数据赋给al,但在在masm中不会把bs:1 中数据赋给al,而是把 [1] 认为是 1 赋给al. 如果要实现在debug中的mov al,[1],在masm中就需要[bx] 如: mov bx,1 mov al,[bx] 还可以用 bs:[1] 的方式 如: mov al,bs:[1] 2.loop 循环 要使