汇编语言实验4 [bx]和loop的使用

(1)编程,向内存0:200-0:23F依次传送数据0-63(3FH)
(2)编程,向内存0:200-0:23F依次传送数据0-63(3FH),程序中只能使用9条指令,9条指令中包括“mov ax,4c00h”和“int 21h"。
(3)下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
程序分析:

【1】内存0:200H~0:23fH空间与0020:0-0020:3f内存空间是一样的,(物理地址是唯一的,但逻辑地址组合是多种的。)

【2】因为偏移地址是连续内存单元;我们可以把偏移地址做下文章。bx寄存器存储偏移地址(通过偏移地址的间接访问内存单元,这主要是写入的内存单元)。dx寄存器作为存储中间变量的容器(源数据,常量0-63)来向内存写入。

(1)编程,向内存0:200~0:23f依次传送数据0~63.

assume cs:code

code segment

   mov ax,0020H

    mov ds,ax   ;内存单元的段地址写入ds寄存器
    mov bx,0    ;bx寄存器存放偏移地址,初始化为0
    mov dx,0    ;dx寄存器存储常量数值0~63
    mov cx,40H  ;这里40H==64,cx寄存器存放循环次数。也可以为64;

   

s:  mov [bx],dx ;向[bx]内存单元写入dx值
    inc bx      ;累加bx
    inc dx      ;累加dx
   loop s 

   mov ax,4c00H
   int 21H
code ends
end

(3)程序功能是将"mov ax,4c00h"之前的指令复制到内存0:200处,补全程序:
程序分析:

内存0:200H~0:23fH空间与0020:0-0020:3f内存空间是一样的,为什么这样?数据0-63是64个连续的数字,0-3fH也是连续的64个编号。我们可以使用一个bx变量就把偏移地址和数字的递增

;只写关键代码
;每次复制单字节数据,并通过al中转
;程序入口为cs:0(ip=0),所以第一空处传递段地址为cs
;接下来需要确定循环次数,即mov ax,4c00h之前的代码长度
;而程序总代码长度可通过debug加载后通过u命令看出
;先将第二空位随便设为1,加载后观察mov ax,4c00h之前代码为0000~0016h,总长度为23.
assume cs:code

code segment

   mov ax,0020H
    mov ds,ax   ;ds指向0020内存段
    mov bx,0    ;bx寄存器存放偏移地址,初始化为0,也当做源数据:常量数值
    mov cx,64   ;循环次数64   

s:  mov [bx],bx ; 向[bx]内存单元写入bx数值
   inc bx
   loop s 

   mov ax,4c00H
   int 21H

code ends
end

结果

-d ds:0

0020:0000  00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F  ................
0020:0010  10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F  ................
0020:0020  20 21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F   !"#$%&'()*+,-./
0020:0030  30 31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F  0123456789:;<=>?

发布日期:

所属分类: 编程, 编程语言 标签:


没有相关文章!