• 今天坏硬盘居然工作了,找到以前写的手机汇编


    一直觉得这个有纪念价值的,现在居然找回来了。先帖一篇,然后打包放到网上硬盘备份!

     看了下文件日期,2004.2.15,情人节之后一天,那时候我在做什么啊……

    $Segmented
    $Mod167  

    ;
    2004.2.9倒计时显示程序,基础:贪睡猫时钟(数字够小,才够显示)
    ;
    2004.3.15 15:55完成
    ;汇编是自考时学的,且学得并不太好,又忘了不少,因此代码可能有错误或是质量差,
    ;欢迎提出意见
    ;修改了原来显示冒号结尾处的代码跳转到本代码,如下:
    ;
    0x27D1EE: BB01 BB20
    ;需改进:日期计算不准确的问题
    ;说明:日期更换以“日”为标准,因此只改月会被认为并未修改日期,不会刷新。

    ;Some Function
    DrawImageByIndex EQU 
    0xB3DF04
    CalcClockNum EQU 
    0xC7D1F2
    ;Some Var
    Day        EQU    25E0H   ;0D:25E0
    Month        EQU    25E2H
    Year        EQU    25E4H

    ;全局变量
    DayCount    EQU    3E30H    ;
    34:3E30
    DateToday    EQU    3E32H

    ;Some Address
    PatchBegin  EQU 
    0xC7D230 ;从0xC7D230开始,前面留10B空间 31F:1230

    patch section code word AT PatchBegin
      fun1 proc far
      ;Add your Code Here
       callr   CalcClockNum ;补原指令,来自DrawMaoHao,显示后两位
      
       MOV     [
    -R0],R4
       MOV     [
    -R0],R7       
       MOV     [
    -R0],R8       
       MOV     [
    -R0],R9       
       MOV     [
    -R0],R12
       MOV     [
    -R0],R13
       MOV     [
    -R0],R14

       extp        #0DH,#
    3
       mov        r14,Day        ;调用获取日期
       mov        r13,Month
       mov        r12,Year

       extp        #34H,#
    1
       cmp        r14,DateToday    ;测试是否今天
       jmpr        cc_Z,IsToday    ;是今天转(不需计算)CC_Z
    ;计算天数并存入全局变量
       mov        r9,#13H        ;日19 依次为直接装入日、月、年
       mov        r8,#14H        ;月4 注:为修改方便编译时改为了14H,以产生 0014更易修改
       mov        r7,#07D4H    ;2004年
       sub        r7,r12        ;年份相减入r7
       jmpr        cc_ULT,Error
       mov        r4,#0CH        ;乘以12,得月数
       mulu        r7,r4
       mov        r7,MDL        ;得到年折算月份
       add        r8,r7        ;月数累加到r8
       sub        r8,r13        ;月份相减入r8
       jmpr        cc_ULT,Error
       mov        r4,#1EH        ;乘以30,得天数
       mulu        r8,r4
       mov        r8,MDL        ;得到月折算天数
       add        r9,r8        ;加入到最后月日期,再减今天
       sub        r9,r14        ;最终天数存入R9
       jmpr        cc_ULT,Error    ;同月但天数更少,转出错
       cmp        r9,#3E8H    ;与1000天比较
       jmpr        cc_ULT,NoError    ;不大于1000,正常转出
    Error:                ;出错,(天数大于1000
    /日期超过),置为0   
       mov        r9,#
    0
    NoError:   
       extp        #34H,#
    2
       mov        DayCount,r9
       mov        DateToday,r14    ;计算成功,把“今天”和“天数”存起来。
       
    IsToday:            ;取各位数字。先百位。
       extp        #34H,#
    1
       mov        r9,DayCount
       mov        r7,#
    0        ;百位先初始化为0
       cmp        r9,#64H        ;与100比较
       jmpr        cc_ULT,Less100
       mov        r7,#64H
       mov        MDL,r9        ;除以100
       divu        r7
       mov        r9,MDH
       mov        r7,MDL
       extp        #34H,#
    2
    Less100:   
       mov        r8,#
    0        ;十位先初始化为0
       cmp        r9,#0AH        ;与10比较
    -----
       jmpr        cc_ULT,Less10
       mov        r8,#0AH        ;除以10
       mov        MDL,r9        ;同上保存
       divu        r8
       mov        r9,MDH
       mov        r8,MDL
       extp        #34H,#
    2
    Less10:
    Show:
       ;开始显示,分别检测百、十、个位为0是否该显示
       cmp        r7,#
    0
       jmpr        cc_EQ,ShowTen    ;百位为0不显
       mov        r12,#10H    ;显示百位
       mov        r13,#20H    ;位置X
    =16,Y=32
       mov        r14,r7
       add        r14,#3BH    ;
    59+i,就是数字几
       calls    seg(DrawImageByIndex),sof(DrawImageByIndex);
       jmpr        cc_UC,MustShowTen    ;百数不为0,十位必须显示
    ShowTen:
       cmp        r8,#
    0
       jmpr        cc_EQ,ShowOne    ;百、十位均为0,十位也不显   
    MustShowTen:
       mov        r12,#1CH    ;十位X
    =16+12=28
       mov        r13,#20H    ;Y
    =32
       mov        r14,r8
       add        r14,#3BH    ;
    59+i,就是数字几
       calls    seg(DrawImageByIndex),sof(DrawImageByIndex);
    ShowOne:
       mov        r12,#28H    ;个位X
    =16+12+12=40
       mov        r13,#20H    ;Y
    =32
       mov        r14,r9
       add        r14,#3BH    ;
    59+i,就是数字几
       calls    seg(DrawImageByIndex),sof(DrawImageByIndex);
    Exit:              ;本来这前面段准备做个循环的,结果一直弄不好,就干脆直接写了。
                ;且r12、r13不能公用,大概DrawImage中修改了它。
    ;显示完了,还能做什么?恢复打理一下回去了
    !
       MOV      R14,[R0
    +]
       MOV      R13,[R0
    +]
       MOV      R12,[R0
    +]
       MOV      R9,[R0
    +]
       MOV      R8,[R0
    +]
       MOV      R7,[R0
    +]
       MOV      R4,[R0
    +]
       
    return:rets        ;此处改为RET仍然编译为DB 00,大约是作为一个程序来编译的,要将
      fun1 endp        ;编译结果改为CB 
    00,不然会死机。
    patch ends
    End

    L.S当时写了个更大的程序,在这里:

    http://www.cnblogs.com/lishenglyx/archive/2008/11/09/1329969.html

  • 相关阅读:
    【系列】CentOS 7.3 离线安装(无网络环境)CI CD环境之sonarqube配置
    Abp vnext 配置Swagger增加token认证
    sonarqube+gitlab runner +docker 代码质量检查问题汇总
    【EF Core】EF core中使用FluentAPI对外键进行指定配置
    【系列】CentOS 7.3 离线安装(无网络环境)CI CD环境之gitlab runner 关于私有docker仓库配置
    【系列】CentOS 7.3 离线安装(无网络环境)CI CD环境之harbor
    【系列】CentOS 7.3 离线安装(无网络环境)CI CD环境之gitlab + gitlab runner(docker in docker)
    【杂记】关于在实际项目中使用TDD的方法
    【系列】CentOS 7.3 离线安装(无网络环境)CI CD环境之docker+docker compose
    【TeamCity】使用TeamCity搭建ASP.NET Core + SVN 的 CICD环境
  • 原文地址:https://www.cnblogs.com/nonlyli/p/1329967.html
Copyright © 2020-2023  润新知