汇编语言中MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的)。其特点是不破坏源地址单元的内容。
MOV AX,2000H;将16位数据2000H传送到AX寄存器。 MOV AL,20H;将8位数据20H传送到AL寄存器。 MOV AX,BX;将BX寄存器的16位数据传送到AX寄存器。 MOV AL,[2000H];将2000H单元的内容传送到AL寄存器。
通过汇编指令控制CPU进行工作,看一下表2.1中的几条指令。
注意,为了使具有高级语言基础的读者更好地理解指令的含义,有时会用文字描述和高级语言描述这两种方式来描述一条汇编指令的含义。在写一条汇编指令或一个寄存器的名称时不区分大小写。如:mov ax,18和MOV AX,18的含义相同;bx和BX的含义相同。
接下来看一下CPU执行表2.2中所列的程序段中的每条指令后,对寄存器中的数据进行的改变。
问题2.1
指令执行后AX中的数据为多少?思考后看分析。
分析:
程序段中的最后一条指令add ax,bx,在执行前ax和bx中的数据都为8226H,相加后所得的值为:1044CH,但是ax为16位寄存器,只能存放4位十六进制的数据,所以最高位的1不能在ax中保存,ax中的数据为:044CH
表2.3中所列的一段程序的执行情况。
问题2.2
指令执行后AX中的数据为多少?思考后看分析。
分析:
程序段中的最后一条指令add a1,93H,在执行前,al中的数据为CSH,相加后所得的值为:158H,但是al为8位寄存器,只能存放两位十六进制的数据,所以最高位的1丢失,ax中的数据为:0058H (这里的丢失,指的是进位值不能在8位寄存器中保存,但是CPU并不真的丢弃这个进位值,关于这个问题,我们将在后面的课程中讨论。)
注意,此时al是作为一个独立的8位寄存器来使用的,和ah没有关系,CPU在执行这条指令时认为ah和al是两个不相关的寄存器。不要错误地认为,诸如add a1,93H的指
令产生的进位会存储在ah中,add a1,93H进行的是8位运算。
如果执行add ax,93H,低8位的进位会存储在ah中,CPU在执行这条指令时认为只有一个16位寄存器ax,进行的是16位运算。指令add ax,93H执行后,ax中的值为:0158H 此时,使用的寄存器是16位寄存器ax, add ax,93H相当于将ax中的16位数据OOcSH和另一个16位数据0093H相加,结果是16位的0158H
在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如:
mov ax,bx mov bx,cx mov ax,18H mov al,18H add ax,bx add ax,20000
等都是正确的指令,而:
mov ax,bl (在8位寄存器和16位寄存器之间传送数据) mov bh,ax (在16位寄存器和8位寄存器之间传送数据) mov al,2000 (8位寄存器最大可存放值为255的数据) add al,100H (将一个高于8位的数据加到一个8位寄存器中)
等都是错误的指令,错误的原因都是指令的两个操作对象的位数不一致。
检测点2.1
拓展阅读MOV
需要注意的是:
(1)两个存储单元之间不能直接传送数据,即:MOV指令只允许一个操作数在存储器中。MOV [SI],[2000H];这是错误的
(2)MOV指令中立即数不能直接传送给段寄存器(CS、DS、SS、ES)和IP;段寄存器之间不能直接传送。MOV IP,2000 H ;这是错误的
(3)CS和IP不能作为目的操作数。MOV CS,AX ;这是错误的
(4)MOV指令中立即数不能作目标操作数。MOV 2000H,[SI] ;这是错误的
MOV指令可以在CPU内或CPU和存储器之间传送字或字节,它传送的信息可以从寄存器到寄存器,立即数到寄存器,立即数到存储单元,从存储单元到寄存器,从寄存器到存储单元,从寄存器或存储单元到除CS外的段寄存器(注意立即数不能直接送段寄存器),从段寄存器到寄存器或存储单元。
但是注意
(1) MOV指令中的源操作数绝对不能是立即数和代码段CS寄存器;
(2) MOV指令中绝对不允许在两个存储单元之间直接传送数据;
(3) MOV指令中绝对不允许在两个段寄存器之间直接传送数据;
(4) MOV指令不会影响标志位*
例:
MOV AX,DATA_SEG MOV DS,AX
注意:段寄存器(段地址)必须通过寄存器如AX寄存器进行立即数的初始化。
例:
MOV AL,‘E’
把立即数(字符E的ASC码)送到AL寄存器。
例:
MOV BX,OFFSET TABLE
将TABLE的偏移地址(而不是内容)送到BX寄存器中。其中OFFSET为属性操作符,表示的是将其后的符号地址的值(不是内容)作为操作数。
例
MOV AX,Y[BP][SI]
把地址为16d×(SS)十(BP)十(SI)十位移量Y的存储单元的内容送给AX寄存器