《汇编语言》第五章 -[bx]和loop指令 实验4答案

第5章:

1.[bx]的用法

[bx]表示一个偏移地址在bx中的内存单元;
inc bx;表示bx=bx+1;

2.loop的用法

loop s: 进行两步操作:
1,(cx)=(cx)-1;
2,判断cx中的值,不为0则转至s所标识的地址处执行为0向下执行;
汇编源程序中,数据不能以字母开头。开头要加上0;
3,debug中可以用‘g adress’来直接执行到所要到的位置;用p直接结束循环

3.关于debug和汇编编译器masm对指令的不通处理

debug将指令中的[idata]解释为一个内存单元;编译器将[idata]解释为idata;
**解决方法:**目前的方法是将偏移地址送入bx中,用[bx]的方式来访问内存单元
**或者:**在’[]'前显示的给出段地址所在的寄存器;例:mov ax,2000h

我们比较汇编源程序中各指令的含义:
'mov ax,[0]',<将常量0送入ax中;>
'mov al,ds:[0]'<将内存单元ds:[0]中的字节数据送入al中;>
'mov al,[bx]'<将内存单元ds:[bx]中的字节数据送入al中;(默认为ds)>
'mov al,ds:[bx]'<与前者相同;>

4.一段安全的空间

以后我们需要直接向一段内存中写入内容时,就使用0:200–0:2ff这段空间。

实验4:[bx]和loop的使用

(1)编程:向内存0:200–0:23F依次传送数据0-63(3FH)。

assume cs:code 
code segment
mov ax,0020h
mov ds,ax		将ds指向0020:0;
mov bx,0		将bx置0;
mov cx,40h		设置循环次数;
s:mov [bx],bl	此处传送的时字节;
inc bx			循环控制变量递增;
loop s			
mov ax,4c00h
int 21h
code ends
end

(2)编程,向内存0:200–0:23F依次传送数据0-63h,程序中只能使用9条指令,9条指令中包括“mov ax,4c00h和int 21h”
答案同上
(3)(将“mov ax,4c00h”之前的指令复制到内存0:200处)补全程序,上机调试,跟踪运行结果。
首先自己根据以往理解写一下程序

assume cs:code
code segment
mov ax,cs
mov ds,ax		将ds指向程序的入口处(cs中存放程序入口地址);
mov ax,0020h
mov es,ax		将es指向要存入的内存段地址;
sub cx,5		设置循环次数(cx中存放程序的长度,
				mov ax 4c00h与int 21h共占5个字节,所以要复制的程序段长度为cx-5);
mov bx,0		初始化bx,做控制变量;
s:mov al,[bx]	
mov es:[bx],al	开始传送数据,(此处为字节传送);
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end

源程序补全如下

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

*实验感悟:*程序在内存中以二进制数据形式存放,cpu将cs的指向解释为指令;所以我们要复制的是cs指向的一段二进制数据,它的总长度被初始化放在寄存器cx中(以字节为单位);我们可以先写好一段代码,在debug中调试跟踪,可以观察到不需要的代码长度为5,于是,需要复制的字节数就是cx-5个;

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值