找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 15351|回复: 9

8086汇编学习过程中自己写的一些代码

[复制链接]
发表于 2017-5-30 21:33:11 | 显示全部楼层 |阅读模式
本帖最后由 老刘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
复制代码

评分

参与人数 2技术 +2 收起 理由
taofan712 + 1 厉害小伙
happy886rr + 1 刮目相看

查看全部评分

发表于 2017-5-30 21:49:38 | 显示全部楼层
这东西理解一下就可以了,8086汇编早已远去。现在只能用来玩玩
 楼主| 发表于 2017-5-30 22:05:47 | 显示全部楼层
回复 2# ivor


    嗯,为win32asm和逆向打基础
发表于 2017-5-31 13:17:45 | 显示全部楼层
回复 3# 老刘1号
你可以去写底层可,底层都是汇编实现。
发表于 2017-5-31 13:32:37 | 显示全部楼层
回复 4# happy886rr


    你有空的时候给我们表演一下c 内嵌 ASM编程吗
 楼主| 发表于 2017-5-31 13:39:09 | 显示全部楼层
回复 5# codegay


    C内嵌更简单,直接asm 后面加汇编指令就行
 楼主| 发表于 2017-5-31 13:39:31 | 显示全部楼层
回复 4# happy886rr


    感谢支持,会考虑的
发表于 2017-5-31 13:42:45 | 显示全部楼层
回复 5# codegay
内联汇编效率并不高,gcc编译器的神优化,使C代码生成的汇编质量非常之高,这也是我为何放弃汇编的原因,即使你汇编学的再好,也没gcc优化的汇编好。

评分

参与人数 1技术 +1 收起 理由
codegay + 1 1

查看全部评分

发表于 2017-5-31 15:47:56 | 显示全部楼层
 楼主| 发表于 2017-5-31 19:14:05 | 显示全部楼层
回复 8# happy886rr


    这个就不能苟同了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:36 , Processed in 0.023675 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表