鱼C论坛

 找回密码
 立即注册
查看: 3701|回复: 0

[汇编作业] Show_Str、DivDW、DtoC函数块

[复制链接]
发表于 2017-6-11 10:20:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 老刘001 于 2017-6-11 12:26 编辑

终于学完了Call&Ret
自己动手写了3个王爽&甲鱼老师要求的函数块……
DEBUG 2小时……

DivDW.ASM
  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 这个是双字版的,当时看到后面还要重写双字版就决定直接写双字版了
  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
复制代码



show_str.ASM
  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
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-7 08:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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