对于一些寄存器的总结
8086cpu中只有bx,si,di,bp四个寄存器可以用在[...]
中进行内存单元的寻址
例如:
1 | mov ax,[bx+si] |
都是正确的,而
1 | mov ax,[cx] |
这些指令都是错误的。
bx和bp,si和di不能组合出现,例如:
1 | mov ax,[bx+si+idata] 正确的 |
使用bp但是没有给出段地址时,段地址默认在ss中:
1 | mov ax,[bp+si] 含义:(ax)=((ss)*16+(bp)) |
数据的位置
三类,1、cpu内部(寄存器);2、内存(如ds:0单元);3、端口(尚未学到)
寻址方式总结
指明数据尺寸
1、通过寄存器名指明字&字节
16位寄存器名如ax,bx进行字操作
8位寄存器如al,bl进行字节操作
2、X ptr
这种方法是用word ptr 或者 byte ptr指明操作对象进行的是字操作还是字节操作。
例如:
1 | mov word ptr ds:[0],1 |
这里可以看到,无论是word ptr还是byte ptr都相当于是一个加在操作对象前面的“修饰符”(l0tus自己取的名字),来指明操作的数据长度
比如,我们想要修改2000:1000 FF FF FF FF FF…
这一段的第一个字节FF,将其改成01,那么我们就要用byte ptr,如果这时候我们指定的长度是word ptr,那么就会将这一段改成01 00 FF FF FF FF...
3、有些指令默认规定操作长度
例如push指令只进行字操作
C风格寻址方式
来看以下纯纯汇编风格指令:
1 | mov si,0 |
来看如下C代码
1 | struct company {...} |
按照C风格的寻址:
1 | mov si,0 |
类似结构体,bx定位整个结构体,idata定位其中某一个数据项,si定位数据项中每一个元素。表达更贴切
div指令
终于学新东西了
div是除法指令,