汇编语言学习笔记9

时间:2022-04-01 03:29:08
转移指令的原理
      刚开始的时候就学了转移指令,例如 jmp bx。现在就系统的学习一下。首先转移分为短转移和近转移,短转移修改ip的范围是-128--127近转移的范围--32768--32767.这说的是段内转移的情况,而按照专一的类型又分为:无条件转移(jmp转移)条件转移指令   循环指令   中断等。
       首先认识一个操作符  offset  
这是一个由编译器处理的符号,它能够取得标号处的偏移地址。例如以下程序
assume cs:code 
code segment
start: MOV ax,offset start
    s: MOV ax,offset s
code ends
END start
offset分别取得了start  和s的偏移地址 0 和3
mov ax, offset start 相当于指令mov ax, 0  start是代码段中的标号,呵呵由于offset取得的是偏移地址而不是短地址所以就是0了呗,同理解释s
                                    jmp转移指令应用到程序中
      jmp short 标号(转到标号处执行指令)由于有short这个转移是短转移,例如下面的程序。
assume  cs:code 
code segment 
start:  MOV ax,0
   JMP short s
   ADD ax, 1
  s:  INC ax
        MOV ax,4c00h
        int 21h
code ends
END start
汇编语言学习笔记9
由debug看出我们直接执行了inc ax 而没有执行add ax,1由此可知转移成功。。其实就是改变了IP 的内容,来进行转移。
       当然我们使用的jmp指令不仅能在标号处进行转移,以前我们也是用debug进行过jmp 寄存器的操作。   这就是进行-32768--32766(16)的转移了,另外我们还可以在内从中进行转移,例如下边的指令     
mov  ax,0123h 
mov  ds:[0],ax
jmp  word ptr ds:[0]
我们看出了 此几条语句中我们用到了段超越前缀,单位操作符 ptr  
         jcxz指令有条件转移,所有的有条件转移都是短转移,指令格式   jcxz  标号    
转移的条件是 cx==0档cx不为零时继续向下执行  
程序举例   利用jcxz指令,实现在内存2000h段中查找第一个值为零的字节,找到后将他的偏移地址存到dx中。程序如下
assume cs:code 
code segment 
start : MOV ax,2000h
MOV ds,ax
MOV bx,0
            MOV  ch,0
s: MOV al,byte ptr [bx]
MOV cl,al
jcxz  ok
INC bx
JMP  short s
 ok: MOV dx,bx
       MOV ax, 4c00h
       int 21h
code ends 
END start
呵呵本课结束了,敬请期待续集,精彩内容更在   http://sela365.com/space.php?do=blog&view=me