操作符offset

  • 在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。

    jmp指令

  • jmp为无条件转移,可以值修改IP,也可以同时修改CS和IP。

  • jmp指令要给出两种信息:
    • 转移的目的地址
    • 转移的距离(段间转移、段内短转移、段内近转移)
  • jmp short标号(转移到标号处执行指令):ip=ip+8 ``` code segment start:
    1. mov ax,0
    2. jmp short s
    3. add ax,1
    4. s: inc ax
  1. mov ax,4c00H
  2. int 21H

code ends end start

  1. - jmp near ptr 标号 实现的是段内近转移:ip=ip+16
  2. - jmp far ptr 标号 段间转移,又称远转移
  3. - jmp word ptr 内存单元地址(段内转移)
  4. - 从内存单元地址处存放着一个值,是转移的目的便宜地址
  5. - jmp dword ptr 内存单元地址(段间转移)
  6. - 从内存单元地址出开始存放这两个值,高地址处的值是转移的目的段地址,低地址出是转移的目的偏移地址。
  7. <a name="bw0uZ"></a>
  8. ## jcxz指令
  9. - 有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地之。
  10. - 指令格式:jcxz 标号
  11. - 如果(cx)=0,则转移到标号出执行。
  12. <a name="CH4oS"></a>
  13. ## call&ret指令
  14. - callret指令都是转移指令,他们都修改ip,或同时修改csip
  15. - ret指令用栈中的数据,修改ip的内容,从而实现近转移
  16. - cpu执行ret指令时
  17. - (ip)=((ss)*16+(sp))
  18. - (sp)=(sp)+2
  19. - call指令经常跟ret指令配合使用,因此CPU执行call指令
  20. - 将当亲的ipcsip压入栈中
  21. - 转移(jmp
  22. - call指令不能实现端转移,除此之外,call指令实现转移的方法和jmp指令的原理相同
  23. - call 标号,相当于:
  24. - push ip
  25. - jmp near ptr 标号

code segment start:
mov sp,10h mov ax,0123h mov ds:[0],ax mov word ptr ds:[2],0 call dword ptr ds:[0]

  1. mov ax,4c00H
  2. int 21H

code ends end start

  1. (cs)=0000,(ip)=0123,(sp)=0c
  2. <a name="M7RRi"></a>
  3. ## mul命令
  4. - mul是乘法命令
  5. - 相乘的两个数:要么都是8位,要么都是16
  6. 计算data段中数据的3次方:

data segment dw 1,2,3,4,5,6,7,8 dw 0,0,0,0,0,0,0,0 data ends
code segment start:
mov ax,data mov ds,ax xor bx,bx mov cx,8h xor si,si s: mov ax,[bx] mul [bx] mul [bx] mov [bx+10h],ax add bx,2 loop s

  1. mov ax,4c00H
  2. int 21H

code ends end start

  1. <a name="yGlHa"></a>
  2. ## 批量数据的传递
  3. - 将data段中的字符串转化为大写

data segment db ‘conversation’ data ends
code segment start:
mov ax,data mov ds,ax
mov cx,12d mov si,0h call capital

  1. mov ax,4c00H
  2. int 21H

capital:and byte ptr [si],11011111b inc si loop capital ret

code ends end start

  1. <a name="VZDMk"></a>
  2. ## 寄存器冲突问题
  3. - 讲一个全是字母,以0结尾的字符串,转化为大写

data segment db ‘word’,0 db ‘unix’,0 db ‘wind’,0 db ‘good’,0 data ends
code segment start:
mov ax,data mov ds,ax
mov bx,0h
mov cx,4 s: mov si,bx push cx call capital pop cx add bx,5h loop s

  1. mov ax,4c00H
  2. int 21H

capital:mov cl,[si] mov ch,0 jcxz ok and byte ptr [si],11011111b inc si jmp short capital

ok: ret

code ends end start
```