首页
社区
课程
招聘
[求助]帮我看下这个汇编程序display模块怎么调用失败啊
发表于: 2008-1-12 21:58 3790

[求助]帮我看下这个汇编程序display模块怎么调用失败啊

2008-1-12 21:58
3790
.386
Right equ       04dh
dseg segment
      Year     dw 0
      Month    db 0
      temp     db 10 dup(0)
      count dw ?
      ErrMsg   db 0dh,0ah,"The input NOT decimal! $"
dseg ends

cseg segment
      assume cs:cseg,ds:dseg
start:
      mov ax,dseg
      mov ds,ax

      call GetYearMonth

Ws:
      mov bx,Year
      mov dl,Month
      call far ptr Display
again:
      mov ah,0
      int 16h
      cmp ah,0
      je Exit
      cmp ah,1
      je NextY
      cmp ah,2
      je PreY
      cmp ah,3
      je PreM
      cmp ah,4
      je NextM
      jmp again

NextY:
      inc Year
      jmp Ws
PreY:
      dec Year
      jmp Ws
NextM:
      inc Month
      cmp Month,12
      jbe skip0
      mov Month,1
      inc Year
skip0:
      jmp Ws
PreM:
      dec Month
cmp Month,1
      jae skip1
      mov Month,12
      dec Year
skip1:
      jmp Ws

Exit:
      mov ah,4ch
      int 21h

;**************************************************

GetYearMonth      proc    near
      push ax
      push cx
      push si
      push di

inputagain:
      mov Year,0
      mov Month,0

      mov si,0
repeatY:
      mov ah,1
      int 21h
      cmp al,0dh
      je   EndY
      cmp al,20h
      je   EndY
      cmp al,1bh
      je   ExitDos0
      cmp al,30h
      jb   Err
      cmp al,39h
      ja   Err
      sub al,30h
      mov temp[si],al
      inc si
      jmp repeatY

Err:
      mov ah,9
      lea dx,ErrMsg
      int 21h
      mov ah,2
      mov dl,0dh
      int 21h
      mov dl,0ah
      int 21h
      jmp inputagain

EndY:
      mov bx,10
      mov di,si
      mov si,0

NextYBit:
      mov ah,0
      mov al,temp[si]
mov count,di
      sub count,si
      dec count
      mov cx,count
      jcxz skipY
lopmul: mul bx
      loop lopmul
skipY: add Year,ax
      inc si
      cmp si,di
      jne NextYBit

;----------------------------------The year is put into [Year]

      push dx
      mov ah,2
      mov dl,0dh
      int 21h
      mov dl,0ah
      int 21h
      pop dx
      jmp skiplap

ExitDos0:
      jmp ExitDos

skiplap:
      mov si,0
repeatM:
      mov ah,1
      int 21h
      cmp al,0dh
      je   EndMon
      cmp al,20h
      je   EndMon
      cmp al,1bh
      je   ExitDos
      cmp al,30h
      jb   Err
      cmp  al,39h
      ja   Err
      sub al,30h
      mov temp[si],al
      inc si
      jmp repeatM

EndMon:
      mov di,si
      mov si,0
      mov bl,10
NextMBit:
      mov al,temp[si]
      mov count,di
      sub count,si
      dec count
mov cx,count
      jcxz skipM
lpmul: mul bl
      loop lpmul
skipM: add Month,al
      inc si
      cmp si,di
      jne NextMBit

;-------------------------The Month is put into [Month]

      push dx
      mov ah,2
      mov dl,0dh
      int 21h
      mov dl,0ah
      int 21h
      pop dx

      pop di
      pop si
      pop cx
      pop ax
      ret
ExitDos:
      mov ah,4ch
      int 21h
GetYearMonth endp

cseg ends
      end start

;打印模块:
;***********************************
;入口参数:bx = Year dl=Month
;***********************************

PUBLIC Display
data segment
      Year         dw ?
      Month       db ?
      leap     db ?
      weekstr db " MON TUR WEN THU FRI SAT SUN",'$'
      fillblank db "     $"
      fillblank4 db "    $"
      fillblank3 db "   $"
      c        db ?
      y        db ?
      firstday db ?
      temp  db ?
      MonthSize db ?
data ends

cseg segment
      assume cs:cseg,ds:data
Display proc   far
      push ds

      mov ax,data
      mov ds,ax

      mov Year,bx
      mov Month,dl

      mov dx,0
      xor bh,bh
      mov ah,2
      int 10h

      mov ah,6
      mov al,0
      mov bh,01110000b
      mov ch,0
      mov cl,0
      mov dh,24
      mov dl,79
      int 10h

      mov ah,6
      mov al,0
      mov bh,01110100b
      mov ch,0
      mov cl,25
      mov dh,24
      mov dl,79
      int 10h

      call far ptr dispYM

      lea dx,weekstr
      mov ah,9
      int 21h
      mov ah,2
      mov dl,0dh
      int 21h
      mov dl,0ah
      int 21h

      call GetMonthSize      ;把当前月份的天数放到MonthSize

      cmp Month,2
      ja skip
      add Month,12
      dec Year
skip:
      mov bl,100
      mov ax,Year
      div bl
      mov c,al
mov y,ah
      mov cl,2
      mov bl,c
      shr bl,cl    ;int(c/4)
      shl c,1       ;2*c
      sub bl,c
      add bl,y
      shr y,cl     ;int(y/4)
      add bl,y    ;int(c/4)-2*c+y+int(y/4)--->bl
      inc Month
      xor ah,ah
      mov al,Month
      mov dx,13
      mul dx
      mov cx,5
      div cx
      xchg ax,bx
      cbw
      xchg ax,bx
      add bx,ax ;int(c/4)-2*c+y+int(y/4)+int(13*(m+1)/5)
      mov ax,bx
      mov cl,7
      idiv cl
      cmp ah,0
      jG skipAdd
      add ah,7
skipAdd:
      mov bl,ah
      mov firstday,bl

;--------------------------------计算出当前月份的第一天是星期几

      mov cl,bl
      mov ch,0
      dec cl
      jcxz skipF
FillB:   mov ah,9
      lea dx,fillblank
      int 21h
      loop FillB
skipF:
      mov cl,1
disLop: call dispWeek           ;日期已经放入cl
      inc cl
      inc bl
      cmp bl,8
      jb skipModle
mov MonthSize,31
      jmp return
returnEven:
      mov MonthSize,30
      jmp return

return2:
      mov MonthSize,28
      cmp leap,0
      je return
      inc MonthSize
return:
      pop dx
      pop bx
      ret
GetMonthSize endp

;*****************************************************************

dispWeek proc    near
      push cx
      push bx
      push ax
      push dx

      cmp cl,10
      jae DoubleDig

      lea dx,fillblank4
      mov ah,9
      int 21h
      mov dl,cl
      add dl,30h
      mov ah,2
      int 21h
      jmp back

DoubleDig:
      mov ch,10
      mov ah,0
      mov al,cl
      div ch

      mov cx,ax
      mov ah,9
      lea dx,fillblank3
      int 21h
      mov dl,cl
      add dl,30h
      mov ah,2
      int 21h
      mov dl,ch
      add dl,30h
      int 21h
back:
      pop dx
      pop ax
      pop bx
      pop cx
ret
dispWeek endp
;*********************************************************

dispYM      proc    far
      push bx
      push dx

      mov ax,year
      mov dh,10
      xor si,si
next:   div dh
      mov cl,ah
      mov ch,0
      inc si
      push cx
      mov ah,0
      cmp ax,0
      jne next

      mov cx,si
repeat:      pop dx
      mov ah,2
      add dl,30h
      int 21h
      loop repeat

      mov dl,0dh
      mov ah,2
      int 21h
      mov dl,0ah
      mov ah,2
      int 21h

      mov al,Month
      mov ah,0
      mov bl,10
      div bl
      mov cx,ax
      mov dl,cl
      mov ah,2
      add dl,30h
      int 21h
      mov dl,ch
      add dl,30h
      int 21h

      mov dl,0dh
      mov ah,2
      int 21h
      mov dl,0ah
      mov ah,2
      int 21h

      pop dx
      pop bx
      ret
;****************************************************
cseg ends
      end

帮忙看下额。。受不了了。就是调用不成功,改了display的名字还是不行。。。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//