1.Ds+偏移地址表示内存单元;
2.描述一个内存单元需要两种信息:(1)内存单元的地址;(2)内存单元的长度(数据类型);
3.定义描述性符号“()”来表示一个寄存器或一个内存单元中的内容,“()”中的元素可以有3种类型:a.寄存器名,b.段寄存器名,c.内存单元的物理地址(一个20位的数据),一般“()”内的数据类型有两种,具体是哪一种类型由寄存器或具体的运算决定;
4.一般情况下,常量必须卸载“[]”中;
5.loop指令执行的两个基本步骤:先对cx的值减去1,然后判定cx的值是不是为0,如果为0则向下继续执行,不为0则跳转至标号处;
6.在本书的汇编语言之中,一般一个标号代表一个地址;
7.cx和loop指令相互配合实现循环功能的3个要点:
(1)在cx中存放循环次数;
(2)loop指令中的标号所标识的地址要在前面;
(3)要循环执行的程序段,要写在标号和loop指令的中间。
8.关于乘法的一点小学阶段的理解:123*236,相当于12
3连续相加236次,所以编程的时候用的是add ax,123;
9.汇编语言之中,数据不能以字母开头,通常在字幕前面加0;
10.存放累加数据的时候一般考虑两个问题:是否溢出和数据长度是否匹配,如果不匹配需要哪一种寄存器来中转;
11.关于debug中p指令和G指令的说明,p指令通常一次性执行loop中的内容,而g指令可以看作类似于goto的跳转指令;
12.由于汇编的源程序和debug对于"[]"的数字的处理不同,因此为了统一,通常先将数据放入一个寄存器中,例如bx中,然后利用[bx]来访问内存单元;
例如:
mov al,[0] 与mov al,0相同
mov al,ds:[0] 将(al)=((ds)*16+0)的数据送人内存中
mov al,[bx] 将(al)=((ds)*16+bx)的数据送入al中
mov al,ds:[bx] 与mov al,[bx]相同。
13.关于段前缀的说明,例如下面内容:
mov ax,ds:[bx]
mov ax,cs:[bx]
mov ax,ss:[bx]
mov ax,es:[bx]
mov ax,ss:[0]
mov ax,cs:[0]
例如"[]"前面的"ds","es","ss","cs"就是段前缀,一般用来明确的指向一个内存单元。
14.写指令的时候尽量用一段安全的内存空间,具体做法是使用前可以用d命令查看该段内存空间是否为0,否则有可能引起调试出错;
实验4
1.编程,向内存0:200-0:23F依次传送数据0~63(3FH)。
assume cs:code
code segment
mov ax,0
mov ds,ax
mov bx,200h
mov cx,64
mov al,0
s:mov [bx],al
inc bx
inc al
loop s
mov ax,4c00h
int 21h
code ends
end
2.编程,向内存0:200-0:23F依次传送数据0~63(3FH),只能使用9条指令。
assume cs:code
code segment
mov ax,20h//换一种方法写段的起地址,为的是[bx]直接可以拿来用,而不用再次
赋值或者清零
mov ds,a
x
mov bx,0
mov cx,64
s:mov [bx],bl//用bl给bx赋值,可以看做是值的传递
inc bx//换成bl也可以
loop s
mov ax,4c00h
int 21h
code ends
end
3.补全下面的程序,其功能是将
“mov ax,4c00”之前的指令复制到内存
0:200处。
assume cs:code
code segment
mov ax,cs//由于复制的是内存中的数据,而cs:ip
指示了内存中的
地址,所以将cs的值传递给ax。
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,17h//前面的源程序在内存中总共占了23字节,这个是将源程序
编译连接之
后用debug里面的U命令查看即可
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end