第8章 数据处理的两个基本问题
数据的处理有两个关键,从之前的学习中也体会到了
8.1 bx、si、di、bp
为什么会将这四个寄存器划到一节,原因就是
这四种寄存器只能单独出现或者以如下几种组合出现
bx+si,bx+di,bp+si,bp+di
最多还能再后面加上一个常量,即idata
看到这里想起来一个寄存器 ebp,用来指向栈底的
这里我想应该是bx,bp分别默认指向不同的段,所以不能一起用
而既然si,di与bx功能差不多,那为什么能与bp一起用
又或者说不能si+di的使用呢
继续往下看
8.2 机器指令处理的数据所在位置
计算机是一个对数据进行运算,处理的机器
8.3 汇编语言中数据位置的表达
在汇编语言中如何表达数据的位置?汇编语言中用三个概念来表达数据的位置。
这里的段地址可以是默认的,也可以是明显给出的,之前有体现,这里就不截图了
8.4寻址方式
8.5 指令要处理的数据有多长?
这个举例就是
比如ax寄存器的长度为16bits 2bytes
那用到ax寄存器的指令就是要处理两个字节的长度
而al,ah寄存器长度为8bits 1byte
则用到al,ah寄存器的指令就是除了一个字节的长度

8.6 寻址方式的综合应用
8.7 div指令
div是除法指令
从上述指令可以看出,被除数在指令中没有给出,给出的只有除数
用word ptr指明除数为16位,则对应的被除数为32位,ax存储商,dx存储余数
用byte ptr 指明除数为8位,则对应的被除数为16位,al存储商,ah存储余数
而且除数是以内存单元的形式或者寄存器的形式给出的,不能直接用idata(立即数)
从实例中可以看出 32—16 16—8的关系必须严格遵守,即使除数只有8位,面对32位被除数也要提到16位的寄存器中
8.8伪指令dd
又学会了一个定义数据的方法
8.9 dup
这下也是能看懂ida的伪代码了
不过又在ida里看到的dq
这应该是64位系统中,一个寄存器的最大值了
第9章 转移指令的原理
这就是我们之前用到的jmp指令,现在再来复习一下它的用法
9.1操作符offset
在上面的程序中,offset操作符取得了标号start和s的偏移地址0和3,所以指令:
mov ax,offset start相当于指令mov ax,0,因为stat是代码段中的标号,它所标记的指 令是代码段中的第一条指令,偏移地址为0;
mov ax,offset s相当于指令moy ax,3,因为s是代码段中的标号,它所标记的指令是代
码段中的第二条指令,第一条指令长度为3字节,则s的偏移地址为3。
下面看个实例代码,将s的一条指令送到s0
这里的offset s相当于取得了s标号偏移地址,也就是mov ax,bx这个指令的偏移地址
然后分别把s和s0的地址送入si和di,然后将mov ax,bx这个指令的二进制数据送到ax寄存器
因为这个指令占两个字节,ax刚好装下
然后将ax的内容发送到内存单元cs:[di],也就发送到看s0的标号处
9.2 jmp指令
9.3 依据位移进行转移的jmp指令
这里改变的就只多了 mov bx,0这个指令
所以这里的原理应该是
当执行到jmp s时,cpu会自动计算执行完jmp s这串机器码后,到标号s的相对距离
执行完jmp s,ip指针会增加,然后cpu再根据计算的相对距离改变ip指针的值,到达s标号出
好比
mov ip,[ip+idata]
主要是那个图有点抽象,我只有自己这么理解了
那这里的标号其实不是获取标号的地址,而是作为一个标记,cpu执行时好根据这个标记计算ip应该改变的量
9.4 转移的目的地址在指令中的jmp指令
所以再short jmp,并不会真正的记录标号的地址,只是计算偏移量
而 far jmp,就是真真的记录下表单的地址并改变CS:IP的值
9.5 转移地址在寄存器中的jmp指令
9.6 转移地址在内存中的jmp指令
9.7jcxz指令
jxz指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中
包含转移的位移,而不是目的地址。对P的修改范围都为:-128~127。
这个看起来应该是用于loop里面的跳转
9.8 loop指令
1oop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位
移,而不是目的地址。对P的修改范围都为:-128~127。
这么看的话loop相当于可以计数的循环,而jcxz是while循环,只要cx值一直为0,就会一直循环
9.9 根据位移进行转移的意义
下面说明了这种计算相对位移的好处,如果是固定地址的话,随着内存的变动,可能s标号就不再它应该在的地址,这样jmp s,就会到一个我们无法预料的位置,造成程序错误。
而如果是相对位移的话就不会出现这种错误,因为他们的相对位移是不变的
9.10 编译器对转移位移超界的检测
其实主要就是说明这种 位移转移的范围
short是 -128~127(8位对半分)
near是 -32768~32767(16位对半分)