现在的位置: 首页 > 综合 > 正文

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

2012年10月13日 ⁄ 综合 ⁄ 共 3777字 ⁄ 字号 评论关闭

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

 看了下文件日期,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

抱歉!评论已关闭.