汇编学习(四)8086汇编拾遗 (3)

古城微笑少年丶 2022-08-22 04:54 321阅读 0赞
  1. jcxz 指令:条件指令,所有的转移都是短转移,IP 的修改范围是-128~127 之间。
  2. eg. 查找内存2000H段中的一个值为0的字节,然后将它的偏移地址存储在dx 中。
  3. assume cs:code code segment start: mov ax,2000H mov ds,ax mov bx,0 S:mov ch,0 mov cl,ds:[bx] jcxz OK inc bx jmp S OK: mov dx,bx mov ax,4c00h int 21h code ends end start

使用偏移量进行转移的意义: 方便程序段在内存中的浮动装配,也就是地址重定向的原理,链接过程的精髓,其实只是一个很简单的道理。 当编译器检测到位移超界后就会报错,这一点编译器可以做到。所以jmp 指令后的标号其实就是偏移量,带有符号位的偏移量。 关于一个绿色“hello world” 程序的小例子

  1. assume cs:code ,ds:data
  2. data segment
  3. db 'hello world'
  4. data ends
  5. code segment
  6. start:
  7. mov ax,data
  8. mov ds,ax
  9. mov ax,0b800H
  10. mov es,ax
  11. mov si ,0
  12. mov di ,10*160 + 80
  13. mov cx,11
  14. S1:mov al,ds:[si];
  15. mov ah,00000010B
  16. mov es:[di],ax
  17. inc si
  18. inc di
  19. inc di
  20. loop S1
  21. mov ax,4c00h
  22. int 21h
  23. code ends
  24. end start

这仅仅是一个小例子,我们接着学习。 ret 指令:从栈中弹出一个值,修改IP 内容 retf 指令: 从栈中先弹出一个值IP ;然后弹出一个值CS。 call 指令 : 将下一条指令压栈,转移 关于call 的几种用法: call 标号: 将下一条IP 压栈,然后转到标号处执行指令,call 也是一个转移偏移。 call far ptr 标号:实现的是段转移,实现过程,先压CS 再压IP进栈。跳转到标号去。 call reg : 直接跳转寄存器的值。 call word ptr: 内存单元地址 ,相当于直接使用内存中的值修改IP。 call dword ptr 内存单元地址,相当于先压CS 再压IP 。 一个简单的函数小例子来自《汇编语言》

  1. assume cs:code
  2. code segment
  3. start: mov ax,1
  4. mov cx,3
  5. call s
  6. mov bx,ax
  7. mov ax,4c00h
  8. int 21h
  9. s:add ax, ax
  10. loop s
  11. ret
  12. code ends
  13. end start

自此我们就可以尝试设计带有子程序的程序了。 mul 乘法指令: 参数注意:要么都是8位,要么都是16位,如果是8位,一个默认在AL,另一个在8位reg 和 内存中,如果是16位,一个默认在AX 中,另一个在16位reg 或内存单元中。 结果:如果是8位年默认在AX 中,如果是16位,结果高位默认在DX ,低位在AX。

发表评论

表情:
评论列表 (有 0 条评论,321人围观)

还没有评论,来说两句吧...

相关阅读