通过汇编指令控制CPU进行工作,看一下表中的几条指令:
汇编指令举例
汇编指令 | 控制CPU完成的操作 | 用高级语言的语法描述 |
mov ax,18 | 将18送入寄存器AX | AX=18 |
mov ah,78 | 将78送入寄存器AH | AH=78 |
add ax,8 | 将寄存器AX中的数值加上8 | AX=AX+8 |
mov ax,bx | 将寄存器BX中的数据送入寄存器AX | AX=BX |
add ax,bx | 将AX和BX中的数值相加,结果存在AX中 | AX=AX+BX |
注意,为了使具有高级语言基础的读者更好地理解指令的含义,有时会用文字描述和高级语言描述这两种方式来描述一条汇编指令。在写一条汇编指令或一个寄存器的名称时不区分大小写。如mov ax,18和MOV AX,18的含义相同;bx和BX的含义相同。
接下来看一下CPU执行表中所列的程序段中的每条指令后,对寄存器中的数据进行的改变:
程序段中指令的执行情况之一(原AX中的值:0000H,原BX中的值:0000H)
程序段中的指令 | 指令执行后AX中的数据 | 指令执行后BX中的数据 |
mov ax,4E20H | 4E20H | 0000H |
add ax 1406H | 6226H | 0000H |
mov bx,2000H | 6226H | 2000H |
add ax,bx | 8226H | 2000H |
mov bx,ax | 8226H | 8226H |
add ax,bx | ?(参见问题2.1) | 8226H |
问题2.1
指令执行后AX中的数据为多少?思考后看分析。
分析:
程序段中的最后一条指令add ax,bx,在执行前ax和bx中的数据为8226H,相加后所得的值为:1044H,但是ax为16为寄存器,只能存放4位十六进制的数据,所以最高位的1不能在ax中保存,ax中的数据为044CH。
下表中所列一段程序的执行情况:
程序段中指令的执行情况之二
程序段中的指令 | 指令执行后AX中的数据 | 指令执行后BX中的数据 |
mov ax,001AH | 001AH | 0000H |
mov bx,0026H | 001AH | 0026H |
add al,bl | 0040H | 0026H |
add ah,bl | 2640H | 0026H |
add bh,al | 2640H | 4026H |
mov ah,0 | 0040H | 4026H |
add al,85H | 00C5H | 4026H |
add al,93H | ?(参见问题2.2) | 4026H |
问题2.2
指令执行后AX中的数据为多少?思考后看分析。
分析:
程序段中的最后一条指令add al,93H,在执行前,al中的数据为C5H,相加后所得值为:158H,但是al为8为寄存器,只能存放两位十六进制数据,所以最高位的1丢失。
ax中的数据为:0058H。(这里的丢失,指的是进位制不能在8位寄存器中保存,但是CPU并不是真的丢弃这个进位制,关于这个问题,我们将在后面的课程中讨论。)
注意,此时al是作为一个独立的8位寄存器来使用的,和ah没有关系。CPU在执行这条指令是会认为ah和al是两个不相关的寄存器。不要错误地认为,如add al,93H的指令产生的进位会存储在ah中,add al,93H进行的是8位运算。
如果执行add ax,93H,低8位的进位会存储在ah中,CPU在执行这条指令时会认为只有一个16位寄存器ax,进行的是16位运算。
指令add ax,93H执行后,ax中的数值为:0158H。此时,使用的寄存器是16位寄存器ax, add ax,93H相当于将ax中的16位数据00C5H和另外一个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,20000(8位寄存器最大可存放值为255的数据)
add al,100H(将一个高于8位的数据加到一个8位寄存器中)
等都是错误的指令,错误的原因都是指令的两个操作对象的位数不一致。
问:为什么在写一条汇编指令或一个寄存器的名称时不区分大小写?
答:大写AX与小写的ax虽然有大小写区分,但是意义相同。
问:为什么ah和al,是两个不相关的寄存器?
答:两个都是8位寄存器,都是独立的,各管各的事情。
问:为什么两个操作对象的位数应当是一致的?
答:书写出来清晰又好看,便于理解。