2.3几条汇编指令

 通过汇编指令控制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位寄存器,都是独立的,各管各的事情。

 

    问:为什么两个操作对象的位数应当是一致的?

    答:书写出来清晰又好看,便于理解。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值