8086的指令系统
今天上午综测答辩结束,感觉就很一般,但是我昨晚也操心到觉都没睡好,今天中午舍友玩P5吵得我也没睡着,感觉脑袋昏昏沉沉,汇编上课没认真听讲,晚上来补一补。还是采用GPT来讲解(水文字),我写一些个人看法的方式,
首先,8086指令系统有以下六种:
我不知道为什么?新版QQ截图的时候老是屏幕变黑或者变灰。
一、数据传送类指令
通用数据传送类指令
1、传送指令MOV:
mov dest,src; dest<-src
这个就是把src传给dest.
其中有很多形式:
mov reg/mem, imm; 立即数送寄存器或主存
mov reg/mem/seg , reg; 寄存器送寄存器(包括段寄存器)或主存
mov reg/seg, mem; 主存送寄存器(包括段寄存器)
看这上面的注意点:两个段寄存器之间不能直接传数据,并且立即数不能直接送入段寄存器里面。
标红的是错误的汇编语法,其实上面的mov dl,ax和mov [1000H],[2000H]也是错误的。为什么?
mov dl,ax错是因为ax是16位dl放不下,mov [1000H],[2000H]错是因为8086不支持内存空间转移到内存空间。假如你要做内存空间转移的操作,用寄存器做中介。
mov ax,buffer1
mov buffer2,ax 这是书上给出的例子。
关于为什么立即数不能直接送入段寄存器里面,据说是因为由于立即数直接写入段寄存器这样的指令,被翻译成机器码之后将占用更多的字节,在事先规定的指令长度范围内无法存贮下这么多的内容,因此改由先写入通用寄存器,再由通用寄存器写入段寄存器的办法代替。立即数实际上是相当占地方的。也就是说立即数写入通用寄存器的机器码比较短吧。要记住这就是8086的设计?
这里插播一个知识点:以字母打头的立即数前面要加一个前导0.原因不想打字了。
另外mov中还有byte和word这2个关键字,其实8086是16位微处理器,所以word就是16位,byte是8位。观察这个指令:
mov al, 050ahl; 这肯定是非法指令啊!050ah是字,al是字节,你怎么塞的下?
2、交换指令XCHG:
这是老师的PPT,但是我觉得有点小问题:
问题出在 XCHG mem,mem 的形式是非法的。
OK?XCHG指令可以在通用寄存器与通用寄存器或存储器之间对换数据,但是不能在存储器与存储器之间交换数据。
这是给出的注意点,上面也提到不能同时位mem.
XCHG怎么记住呢?我们知道对换是exchange,这里取xchg,我猜的,就这样记吧。
3、换码指令XLAT
这个是老师课上讲的最抽象的。当时我确实没听,开摆了。
xlat的作用是将BX指定的缓冲区中,AL指定的位移处的数据取出来赋给AL。
现在我感觉就是一种查表。
这里等价于把AH设置为0(AL不受影响),所以BX加上AX就是相当于BX位移了AL的距离,然后把现在的BX内存中的值给AL。有没有感觉像是数组:
A【n】,你的BX就是数组头指针A,然后AL就是n呀。所以这是一种查表时候用的命令。
PPT的例二没看懂,不想说了。
堆栈操作类指令
堆栈感觉不用多说,毕竟这个数据结构挺常见,有没有做过判断有效括号的题、有没有做过单调栈问题,这玩意有时也很有难度。
1、进栈指令PUSH
比如push 【2000h】是什么意思?
千万别说是将主存2000h地址内存的数据压栈。
应该是DS:【2000h】.这才是正确的。
另外要记住一点,进栈的话SP是减2。
2、出栈指令POP
标志寄存器传送指令
这个东西我不知道重不重要,我只记得老师讲这里的时候我根本就没听,当时感觉啥都听不进去了。
我觉得要理解这里首先要复习一下标志寄存器:
标志寄存器里面有一堆标志(雾)
LAHF就是把标志寄存器低8位填到AH里面。
这里还有7个标志处理指令,单独拿出来也是一条汇编语句。
这个sti是开中断,cli是关中断。这个在操作系统实验课的代码中操作过。其他的也类似,反正都是一些对标志状态寄存器的操作,也不知道会怎么考。毕竟我现在只关注这个,开始混日子了。
地址传送指令
地址传送指令将存储器的逻辑地址送至指定的寄存器。
这个LEA就是传有效地址,
平时我们看到
mov bx,[bx+si+0f62h]这个意思是把这个地址内存单元里面的数移到bx里面
但是
lea bx,[bx+si+0f62h]是把这个有效地址给BX。
我觉得他等价于 mov bx,bx+si+0f62h;
所以为什么不直接用mov bx,bx+si+0f62h;非要lea bx,[bx+si+0f62h]。这样还多出一个LEA指令码,让我觉得很匪夷所思,到底是谁脑子有问题?是我吗?
还有个LDS指令和LES指令我有点看不懂。
8086具有20条地址总线,这使得8086能够直接寻址的最大内存空间为2^20(即1MB)字节,地址范围从00000H到FFFFFH。
为啥Mem32能窜出32位,这个有点搞笑了,有没有懂得小伙伴能在评论区给我说一下。
今天就更到数据传送类搞完。明天写算术运算指令,这个很难。