汇编学习(八)8086汇编拾遗 (7)

£神魔★判官ぃ 2022-08-22 15:14 293阅读 0赞
  1. int 中断指令
  2. 使用方式:
  3. int n. n 为中断类型码,它的功能是引发中断,n 为引发的中断号。
  4. 先写一个中断程序的例子吧,安装中断7ch 中断例程,计算一个字型数的平方。
  5. assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset sets mov di,200h mov ax,0 mov es,ax mov cx,offset sets0 - offset sets cld rep movsb mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4 + 2],0 mov ax,4c00h int 21h sets: mul ax iret sets0:nop code ends end start

再来一个转换字符串的中断。 功能:将一个全是子母,以0结尾的字符串转换为大写。

  1. assume cs:code
  2. code segment
  3. start:
  4. mov ah,2
  5. mov bh,0
  6. mov dh,5
  7. mov dl,12
  8. int 10h
  9. mov ah,9
  10. mov al,'a'
  11. mov bl,11001010b
  12. mov bh,0
  13. mov cx,3
  14. int 10h
  15. mov ax,4c00h
  16. int 21h
  17. code ends
  18. end start

使用int 模拟 loop

  1. assume cs:code
  2. code segment
  3. start:
  4. mov ax,cs
  5. mov ds,ax
  6. mov ax,0
  7. mov es,ax
  8. mov si,200h
  9. mov di,offset se
  10. mov cx,offset se0 - offset se
  11. rep movsb
  12. mov ax,0
  13. mov es,ax
  14. mov word ptr es:[7ch*4],0
  15. mov word ptr es:[7ch*4+2],200h
  16. mov ax,4c00h
  17. int 21h
  18. se:
  19. push bp
  20. mov bp,sp
  21. dec cx
  22. jcxz ll
  23. add [bp+2],bx
  24. ll:
  25. pop bp
  26. iret
  27. se0:
  28. nop
  29. code ends
  30. end start

编写7CH中断实现jmp near ptr s 功能:

  1. assume cs:code
  2. data segment
  3. db 'conversion',0
  4. data ends
  5. code segment
  6. start:
  7. mov ax,cs
  8. mov ds,ax
  9. mov si,offset se
  10. mov ax,0
  11. mov es,ax
  12. mov di,200h
  13. mov cx,offset se0 - offset se
  14. rep movsb
  15. mov ax,0
  16. mov es,ax
  17. mov word ptr es:[7ch*4],200h
  18. mov word ptr es:[7ch*4+2],0
  19. mov ax,data
  20. mov ds,ax
  21. mov si,0
  22. mov ax,0b800h
  23. mov es,ax
  24. mov di,12*160
  25. s:
  26. cmp byte ptr [si],0
  27. je ok
  28. mov al,[si]
  29. mov es:[di],al
  30. inc si
  31. add di,2
  32. mov bx,offset s - offset ok
  33. int 7ch
  34. ok:
  35. mov ax,4c00h
  36. int 21h
  37. se:
  38. push bp
  39. mov bp,sp
  40. add [bp+2],bx
  41. pop bp
  42. iret
  43. se0:nop
  44. code ends
  45. end start

编写并安装7ch中断,直到0结束的字符串

  1. assume cs:code
  2. data segment
  3. db 'weclome to linux world!',0
  4. data ends
  5. code segment
  6. start:
  7. mov ax,cs ;添加中断代码
  8. mov ds,ax
  9. mov si,offset se
  10. mov di,200h
  11. mov ax,0
  12. mov es,ax
  13. mov cx,offset se0 - offset se
  14. cld
  15. rep movsb
  16. mov ax,0 ;设置中断号
  17. mov es,ax
  18. mov word ptr es:[7ch * 4],200h
  19. mov word ptr es:[7ch * 4 + 2],0
  20. mov dh,10 ;测试代码
  21. mov dl,10
  22. mov cl,2
  23. mov ax,data
  24. mov ds,ax
  25. mov si,0
  26. int 7ch
  27. mov ax,4c00h
  28. int 21h
  29. se:
  30. mov al,160 ;设置es:0b800h
  31. mul dh
  32. add dl,dl
  33. mov dh,0
  34. add ax,dx
  35. mov di,ax
  36. mov ax,0b800h
  37. mov es,ax
  38. s:
  39. mov al,ds:[si] ;打印字符
  40. mov ah,0
  41. cmp ax,0
  42. je f
  43. mov ah,cl
  44. mov es:[di],ax
  45. inc si
  46. inc di
  47. inc di
  48. jmp s
  49. f:
  50. iret
  51. se0:nop
  52. code ends
  53. end start

编写7C 中断,打印80个!

  1. assume cs:code
  2. code segment
  3. start:
  4. mov ax,cs ;安装中断
  5. mov ds,ax
  6. mov si,offset lp
  7. mov ax,0
  8. mov es,ax
  9. mov di,200h
  10. mov cx,offset lpend - offset lp
  11. cld
  12. rep movsb
  13. mov word ptr es:[7ch*4],200h
  14. mov word ptr es:[7ch*4 + 2],0
  15. mov ax,0b800h ;设置es
  16. mov es,ax
  17. mov di,160*12
  18. mov bx,offset s -offset se
  19. mov cx,80
  20. s:
  21. mov byte ptr es:[di],'!'
  22. add di,2
  23. int 7ch
  24. se:
  25. nop
  26. mov ax,4c00h
  27. int 21h
  28. lp:
  29. push bp ;循环
  30. dec cx
  31. jcxz f
  32. mov bp,sp
  33. add [bp+2],bx
  34. f:
  35. pop bp
  36. iret
  37. lpend:nop
  38. code ends
  39. end start

查看原文:http://zmrlinux.com/2016/05/31/%e6%b1%87%e7%bc%96%e5%ad%a6%e4%b9%a0%ef%bc%88%e5%85%ab%ef%bc%898086%e6%b1%87%e7%bc%96%e6%8b%be%e9%81%97-7/

发表评论

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

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

相关阅读