实验 4 [bx]和 loop 的使用

1、实验目的

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

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

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

 

2、实验准备

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

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

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

 

3、实验内容

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

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

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

实现代码以下:内存

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处,实验成功!!!

 

5、总结与体会

(1)不只能够向内存中写入数据,还能够复制代码

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

(3)loop的做用很大,极大的减小没必要要的重复操做

相关文章
相关标签/搜索