|

楼主 |
发表于 2020-5-21 22:30:45
|
显示全部楼层
本帖最后由 why 于 2020-6-11 13:32 编辑
几条汇编指令
通过汇编指令控制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,相加后所得的值为:1044CH,但是ax为16为寄存器,只能存放4位16进制的数据,所以最高位的1不能在ax中保存,ax中的数据为:04CH。
我们再来看看下表中的程序执行情况
程序段中指令的执行情况之二
程序段中的指令 | 指令执行后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位寄存器,只能存放两位16进制的数据,所以最高位的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(将寄存器bx中的值送入寄存器ax,覆盖掉ax中原有数据)
mov bx,cx(将寄存器cx中的值送入寄存器bx,覆盖掉bx中原有数据)
mov ax,18H(将数据18H送入寄存器ax,,覆盖掉ax中原有数据)
mov al,18H(将数据18H送入寄存器ax的低8位,,覆盖掉ax低8位中原有数据)
add ax,bx(将寄存器ax中的值加上寄存器bx中的值得结果存放在寄存器ax中)
add ax,20000(将寄存器ax中的值和20000相加的结果存放在ax中,这里的20000需要转换成16进制是4E20H,是一个16位的数据,前边的ax也是16位寄存器)
以上都是争取的指令,而:
mov ax,bl (在8位寄存器和16位寄存器之间传送数据)
mov bh,ax (在16位寄存器和8位寄存器之间传送数据)
mov al,20000(20000转换成16进制是4E20,明显16位数据无法存放到8位寄存器中)
add al,100H(100H是一个12位数据,12位数据和8位数据无法相加)
等都是错误指令,错误的原因都是指令的两个操作对象的位数不一样。
这里有一个比较严重的问题,所有图片里边对mov的解释都是:将一个数据送入寄存器。那么上边的两个例子我们发现mov的正确解释应该是:将一个数据送入寄存器,并覆盖掉这个寄存器中原有的数据。我当时就纳闷直接送进去后原来寄存器中的数据怎么办,查询后确定是要直接覆盖掉的。
检测点2.1
1.写出每条汇编指令执行后相关寄存器的值
mov ax,62627 AX=f4a3H
mov ah,31H AX=31a3H
mov al,23H AX=3123H
add ax,ax AX=6246H
mov bx,826CH BX=826cH
mov cx,ax CX=6246H
mov ax,bx AX=826cH
add ax,bx AX=04d8H
mov al,bh AX=0482H
mov ah,bl AX=6c82H
add ah,ah AX=d882H
add al,6 AX=d888H
add al,al AX=d810H
mov ax,cx AX=6246H
做了一遍也详细的说了一下每一步有哪些坑
2.只能使用目前学过的汇编指令,做多用4条指令编程计算2的4次方。
解答:2的4次方是16
add ax,ax是累加,ax加ax存入ax中,正好累加3次2就是2的4次方,ax=2+2=4,ax=4+4=8,ax=8+8=16,
3条指令就搞定了!别忘了我们要先传送一个数据进去,要不然计算机是不会工作的,故
mov ax,2(这里是个10进制的2,但是十进制的2和十六进制的2又是一样的,所以也注意一下这个小问题)
add,ax,ax(将寄存器ax中的值加上寄存器ax中的值得结果存放在寄存器ax中,执行后ax=2+2=4)
add,ax,ax(将寄存器ax中的值加上寄存器ax中的值得结果存放在寄存器ax中,执行后ax=4+4=8)
add,ax,ax(将寄存器ax中的值加上寄存器ax中的值得结果存放在寄存器ax中,执行后ax=8+8=16)
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|