Board logo

标题: 8086汇编学习过程中自己写的一些代码 [打印本页]

作者: 老刘1号    时间: 2017-5-30 21:33     标题: 8086汇编学习过程中自己写的一些代码

本帖最后由 老刘1号 于 2017-5-31 12:28 编辑

不定时更新~

2016.5.30
应王爽老师要求,自己动手写了3个小函数块,DEBUG 3小时……

SHOW_STR.ASM
自定义颜色显示DS:SI指向的字符串(0结尾)
  1.               ;栈空间至少10Byte
  2.    SHOW_STR:  ;功能:显示DS开头的字符串,以0结尾。
  3.               ;参数:
  4.               ;(DH)=屏幕缓存区的行号(范围1-25)
  5.               ;(DL)=列号(范围1-80)
  6.               ;(CL)=颜色
  7.               PUSH      AX          ;备份
  8.               PUSH      BX
  9.               PUSH      SI
  10.               PUSH      SI
  11.               XOR       SI,SI
  12.               MOV       AX,0B800H   ;屏幕缓冲区
  13.               MOV       ES,AX
  14.               XOR       AX,AX
  15.               XOR       BX,BX
  16.               ;AX、BX、SI空闲&可用
  17.               SUB       DH,1
  18.               MOV       AL,DH
  19.               MOV       BL,0A0H
  20.               MUL       BL          ;计算行的偏移
  21.               XOR       DH,DH
  22.               ;DH可用
  23.               SUB       DL,1                           
  24.               ADD       DX,DX       ;计算列的偏移
  25.               ADD       AX,DX       ;得到整体偏移量
  26.               ADD       SI,AX       ;SI赋值为整体偏移量
  27.               XOR       AX,AX       ;AX空闲&可用
  28.               XOR       DX,DX       ;DX空闲&可用
  29.                            
  30.               POP       BX          ;BX定位内存中的字符
  31.               MOV       DL,CL       ;DL储存字符颜色
  32.               SUB       CX,CX       ;CX用来储存字符Ascii码并判断跳出
  33.               
  34.           SHOW_STR_LOOP:
  35.               MOV       CL,[BX]
  36.               JCXZ      SHOW_STR_FINISH
  37.               MOV       ES:[SI],CL
  38.               MOV       ES:[SI+1],DL
  39.               ADD       SI,2
  40.               INC       BX
  41.               JMP       SHOW_STR_LOOP
  42.         SHOW_STR_FINISH:
  43.               POP       SI
  44.               POP       BX
  45.               POP       AX
  46.               RET
复制代码
DivDW.ASM
解决除法溢出。被除数DW型,除数W型,商DW型,余数W型。
  1. DivDW: ;至少需要6Byte栈空间
  2. ;参数:
  3. ;(DX)=DW型被除数高16位
  4. ;(AX)=DW型被除数低16位
  5. ;(CX)=W型除数
  6. ;返回:
  7. ;(DX)=DW型商的高16位
  8. ;(AX)=DW型商的低16位
  9. ;(CX)=余数
  10. ;一阶段:int(H/N)的计算
  11. PUSH BX ;BX可用
  12. PUSH AX
  13. MOV AX,DX
  14. SUB DX,DX ;(DX)=0
  15. DIV CX ;(AX)=商 (DX)=余数
  16. MOV BX,AX
  17. POP AX ;(AX)=DW型被除数低16位
  18. PUSH BX ;备份int(H/N)
  19. ;此时 (AX)=DW型被除数低16位 (DX)=余数=rem(H/N)
  20. ;二阶段:(rem(H/N)*FFFFH+L)/N的计算以及收尾工作
  21. DIV CX ;(DX)=余数 (AX)=商
  22. MOV CX,DX ;(CX)=(DX)=余数
  23. POP DX
  24. POP BX ;还原BX
  25. RET
复制代码
DtoC.ASM
将二进制数字转变为对应的Ascii码,保存在DS:SI
  1. DtoC: ;必须和DivDW函数块一起使用,栈大于20Byte为佳。
  2. ;功能:将Dword型数转变为十进制数的字符串,以0结尾。
  3. ;参数:
  4. ;(AX)=DW型数据的低16位
  5. ;(DX)=DW型数据的高16位
  6. ;DS:SI指向字符串的首地址。
  7. ;返回:DS:SI原位置被字符串覆盖,以0结尾,AX,DX被清零。
  8. PUSH SI
  9. PUSH CX ;备份CX
  10. PUSH BX ;备份BX
  11. PUSH DI ;备份DI
  12. PUSH SI ;再次备份初始地址SI
  13. XOR DI,DI
  14. XOR BX,BX
  15. DtoC_Loop1:
  16. MOV CX,0AH
  17. CALL DivDW
  18. ADD CL,30H
  19. MOV [SI],CL
  20. MOV CX,AX
  21. JCXZ DtoC_Judge
  22. INC SI
  23. INC BX
  24. JMP DtoC_Loop1
  25. DtoC_Judge:
  26. MOV CX,DX
  27. JCXZ DtoC_Next
  28. INC SI
  29. INC BX
  30. JMP DtoC_Loop1
  31. DtoC_Next:
  32. POP SI
  33. PUSH SI
  34. PUSH BX
  35. MOV CX,BX
  36. MOV DI,BX
  37. INC CX
  38. DtoC_Loop2: ;备份并翻转
  39. MOV BX,CX
  40. SUB BX,1
  41. MOV AL,[BX+SI]
  42. MOV BX,DI
  43. MOV [BX+SI+1],AL
  44. INC DI
  45. LOOP DtoC_Loop2
  46. POP BX
  47. POP SI
  48. MOV CX,BX
  49. INC CX
  50. DtoC_Loop3: ;还原
  51. MOV AL,[BX+SI+1]
  52. MOV [SI],AL
  53. INC SI
  54. LOOP DtoC_Loop3
  55. ;收尾
  56. MOV BYTE PTR [BX+1],0
  57. POP DI
  58. POP BX
  59. POP CX
  60. SUB AX,AX
  61. XOR DX,DX
  62. POP SI
  63. RET
复制代码

作者: ivor    时间: 2017-5-30 21:49

这东西理解一下就可以了,8086汇编早已远去。现在只能用来玩玩
作者: 老刘1号    时间: 2017-5-30 22:05

回复 2# ivor


    嗯,为win32asm和逆向打基础
作者: happy886rr    时间: 2017-5-31 13:17

回复 3# 老刘1号
你可以去写底层可,底层都是汇编实现。
作者: codegay    时间: 2017-5-31 13:32

回复 4# happy886rr


    你有空的时候给我们表演一下c 内嵌 ASM编程吗
作者: 老刘1号    时间: 2017-5-31 13:39

回复 5# codegay


    C内嵌更简单,直接asm 后面加汇编指令就行
作者: 老刘1号    时间: 2017-5-31 13:39

回复 4# happy886rr


    感谢支持,会考虑的
作者: happy886rr    时间: 2017-5-31 13:42

回复 5# codegay
内联汇编效率并不高,gcc编译器的神优化,使C代码生成的汇编质量非常之高,这也是我为何放弃汇编的原因,即使你汇编学的再好,也没gcc优化的汇编好。
作者: codegay    时间: 2017-5-31 15:47

nim 的内嵌汇编
https://nim-lang.org/docs/manual ... assembler-statement
作者: 老刘1号    时间: 2017-5-31 19:14

回复 8# happy886rr


    这个就不能苟同了




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2