第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个;