Arsrike
(^_-)HZL
采纳率0%
2020-05-07 15:27

求助大佬,汇编小白有问题

求助大佬,下面这个汇编源代码存在什么问题,没有办法exe(masm,link没有报错,这是一个电子时钟设计)
;定义绘制行的宏指令:
mov     ah,     0ch           ;绘制像素
mov     bh,     0             ;页码
mov     al,     _color        ;颜色
mov     cx,     _col1        ;第一列
mov     dx,     _row          ;行
l1:     int     10h                  ;绘制
inc     cx                    ;下一列
cmp     cx,     _col2         ;比较第二列
jle     l1                    ;跳转未完成
endm
;定义绘制列的宏指令:
mov     ah,     0ch         ;绘制像素
mov     bh,     0              ;页码
mov     al,     _color       ;颜色
mov     cx,     _col          ;列
mov     dx,     _row1          ;第一行
l2:     int     10h                   ;绘制
inc     dx                    ;下一行
cmp     dx,     _row2         ;比较第二行
jle     l2                     ;跳转未完成
endm
;将时间转换为十进制数或者ascii值:
xor ah, ah            ;清除寄存数据
mov dl, 10             ;ax除以10
div dl                    ;ah = 余数, al = 商
or ax, 3030h        ;ax转变为ascii值
ret                           ;返回调用处
convert endp
;判断小时是上午还是下午并且储存:
mov al, ch            ;al为小时
cmp     al,     11             ;如果时间小于11
jng     l5                   ;跳转l5
cmp     al,     24           ;如果时间大于等于24
jnl     l5                    ;跳转l5
mov     amflag, 0              ;am为真
l5: cmp     al,     12        ;如果时间大于12
jg      l4                   ;跳转l4
jmp     l3                   ;如果事件小于等于12时
l4:     sub     al,     12       ;al-12,并且将结果放入al中
l3:     cmp     al,     0       ;相等则ZF=1 否则ZF=0
   jne     l6                  ;ZF=0则跳转
   mov     al,     12
l6:     call convert            ;转换为ASCII
mov [bx], ax      ;储存
;储存分钟:
mov al, cl       ;储存分钟cl到al中
call convert               ;转换为ASCII
mov [bx+3], ax           ;储存
;储存秒:
mov al, dh           ;储存秒dh到al中
call convert               ;转换为ASCII
mov [bx+6], ax             ;储存
ret                         ;返回调用处
get_time endp
;定时器激活的中断程序:
push    ds                    ;保存ds到堆栈中
mov     ax,     @data         ;设置数据为seg
mov     ds,     ax
;获取新时间:
lea     bx,     time_buf     ;使bf指向时间缓冲区,获取时间
call    get_time             ;将时间储存在缓冲区中
;打印小时的第一位数:
mov     rowshft,    65       ;设置行为65
mov     colshft,    30        ;设置列为30
call    print_black         ;设置背景为黑色
mov     al,     '0'         
cmp     [bx],   al
jne     h11
call    print0              ;绘制0
jmp     h1d                  ;开始绘制小时值的第二位
h11:    inc     al                   ;字符指针右移加一
cmp     [bx],   al
jne     h12
  call    print1              ;绘制1
jmp     h1d                   ;开始绘制小时值的第二位
h12:     inc     al                   ;字符指针右移加一
            cmp     [bx],   al
            jne     h13                 
            call    print2                ;绘制2
            jmp     h1d                  ;开始绘制小时值的第二位
h13:     inc     al                    ;字符指针右移加一
            cmp     [bx],   al
            jne     h14
            call    print3               ;绘制3
            jmp     h1d                  ;开始绘制小时值的第二位
h14:     inc     al                   ;字符指针右移加一
            cmp     [bx],   al
            jne     h15
            call    print4               ;绘制4
            jmp     h1d                  ;开始绘制小时值的第二位
h15:     inc     al                   ;字符指针右移加一
            cmp     [bx],   al
            jne     h16
            call    print5               ;绘制5
            jmp     h1d                  ;开始绘制小时值的第二位
h16:     inc     al                   ;字符指针右移加一
            cmp     [bx],   al
            jne     h17
           call    print6               ;绘制6
           jmp     h1d                  ;开始绘制小时值的第二位
h17:     inc     al                   ;字符指针右移加一
            cmp     [bx],   al
            jne     h18
            call    print7               ;绘制7
            jmp     h1d                  ;开始绘制小时值的第二位
h18:     inc     al                   ;字符指针右移加一
            cmp     [bx],   al
            jne     h19
            call    print8               ;绘制8
           jmp     h1d                 :开始绘制小时值的第二位
h19:     call    print9             ;绘制9
;打印小时的第二位数:
h1d:
         mov     rowshft,    65      ;设置行为65
         mov     colshft,    70       ;设置列为70
        call    print_black           ;设置背景为黑色
        mov     al,     '0'
         cmp     [bx+1], al
         jne     h21
             call    print0               ;绘制0
             jmp     h2d                  ;开始绘制冒号
h21:     inc     al                   ;字符指针右移加一
             cmp     [bx+1], al
             jne     h22
             call    print1               ;绘制1
             jmp     h2d                  ;开始绘制冒号
h22:     inc     al                    ;字符指针右移加一
             cmp     [bx+1], al
             jne     h23
             call    print2               ;绘制2
             jmp     h2d                  ;开始绘制冒号
h23:     inc     al                   ;字符指针右移加一
             cmp     [bx+1], al
             jne     h24
             call    print3               ;绘制3
             jmp     h2d                  ;开始绘制冒号
h24:     inc     al                   ;字符指针右移加一
             cmp     [bx+1], al
             jne     h25
             call    print4               ;绘制4
             jmp     h2d                  ;开始绘制冒号
h25:     inc     al                   ;字符指针右移加一
             cmp     [bx+1], al
             jne     h26
             call    print5               ;绘制5
             jmp     h2d                  ;开始绘制冒号
h26:     inc     al                   ;字符指针右移加一
             cmp     [bx+1], al
             jne     h27
             call    print6               ;绘制6
             jmp     h2d                  ;开始绘制冒号
h27:     inc     al                   ;字符指针右移加一
             cmp     [bx+1], al
             jne     h28
             call    print7               ;绘制7
             jmp     h2d                  ;开始绘制冒号
h28:     inc     al                    ;字符指针右移加一
            cmp     [bx+1], al
            jne     h29
            call    print8               ;绘制8
            jmp     h2d                  ;开始绘制冒号
h29:     call    print9             ;绘制9
;绘制冒号:
h2d:
            mov     rowshft,    65       ;设置行为65
            mov     colshft,    120      ;设置列为120
            call    print_black           ;设置背景为黑色
            mov     al,     '0'
            cmp     [bx+3], al
;绘制分钟的第一位数:
            jne     m11
            call    print0                ;绘制0
            jmp     m1d                  ;开始绘制分钟值的第二位
m11:    inc     al                   ;字符指针右移加一
            cmp     [bx+3], al
            jne     m12
            call    print1                ;绘制1
            jmp     m1d                  ;开始绘制分钟值的第二位
m12:   inc     al                   ;字符指针右移加一
            cmp     [bx+3], al
            jne     m13
            call    print2                ;绘制2
            jmp     m1d                  ;开始绘制分钟值的第二位
m13:    inc     al                   ;字符指针右移加一
            cmp     [bx+3], al
            jne     m14
            call    print3                ;绘制3
            jmp     m1d                  ;开始绘制分钟值的第二位
m14:    inc     al                   ;字符指针右移加一
           cmp     [bx+3], al
            jne     m15
            call    print4               ;绘制4
            jmp     m1d                  ;开始绘制分钟值的第二位
m15:    inc     al                   ;字符指针右移加一
           cmp     [bx+3], al
            jne     m16
            call    print5               ;绘制5
            jmp     m1d                  ;开始绘制分钟值的第二位
m16:    inc     al                   ;字符指针右移加一
            cmp     [bx+3], al
            jne     m17
            call    print6               ;绘制6
            jmp     m1d                  ;开始绘制分钟值的第二位
m17:    inc     al                   ;字符指针右移加一
            cmp     [bx+3], al
            jne     m18
            call    print7                ;绘制7
            jmp     m1d                  ;开始绘制分钟值的第二位
m18:   inc     al                   ;字符指针右移加一
            cmp     [bx+3], al
            jne     m19
            call    print8                ;绘制8
            jmp     m1d                  ;开始绘制分钟值的第二位
m19:    call    print9             ;绘制9
;绘制分钟的第二位数:
m1d:
            mov     rowshft,    65       ;设置行为65
            mov     colshft,    160      ;设置列为160
            call    print_black           ;设置背景为黑色
            mov     al,     '0'
            cmp     [bx+4], al
            jne     m21
            call    print0               ;绘制0
            jmp     m2d                  ;打印冒号
m21:    inc     al                   ;字符指针右移加一
            cmp     [bx+4], al
            jne     m22
            call    print1                ;绘制1
            jmp     m2d                  ;打印冒号
m22:    inc     al                   ;字符指针右移加一
            cmp     [bx+4], al
            jne     m23
            call    print2               ;绘制2
            jmp     m2d                  ;打印冒号
m23:    inc     al                   ;字符指针右移加一
            cmp     [bx+4], al
            jne     m24
            call    print3                ;绘制3
            jmp     m2d                  ;打印冒号
m24:    inc     al                   ;字符指针右移加一
            cmp     [bx+4], al
            jne     m25
            call    print4                ;绘制4
            jmp     m2d                 ;打印冒号
m25:    inc     al                   ;字符指针右移加一
            cmp     [bx+4], al
            jne     m26
            call    print5               ;绘制5
            jmp     m2d                  ;打印冒号
m26:    inc     al                   ;字符指针右移加一
            cmp     [bx+4], al
            jne     m27
            call    print6               ;绘制6
            jmp     m2d                  ;打印冒号
m27:    inc     al                   ;字符指针右移加一
            cmp     [bx+4], al
            jne     m28
            call    print7                ;绘制7
           jmp     m2d                  ;打印冒号
m28:    inc     al                   ;字符指针右移加一
            cmp     [bx+4], al
            jne     m29
            call    print8                ;绘制8
            jmp     m2d                  ;打印冒号
m29:    call    print9             ;绘制9
;打印冒号:
m2d:
            mov     rowshft,    65       ;设置行为65
            mov     colshft,    210      ;设置列为210
            call    print_black          ;设置背景为黑色
;打印秒钟的第一位数:
            mov     al,     '0'
            cmp     [bx+6], al
           jne     s11
            call    print0               ;绘制0
            jmp     s1d                  ;打印秒钟值的第二位
s11:     inc     al                   ;字符指针右移加一
            cmp     [bx+6], al
            jne     s12
            call    print1               ;绘制1
            jmp     s1d                  ;打印秒钟值的第二位
s12:     inc     al                   ;字符指针右移加一
            cmp     [bx+6], al
            jne     s13
            call    print2               ;绘制2
            jmp     s1d                  ;打印秒钟值的第二位
s13:     inc     al                   ;字符指针右移加一
            cmp     [bx+6], al
           jne     s14
           call    print3               ;绘制3
            jmp     s1d                  ;打印秒钟值的第二位
s14:     inc     al                   ;字符指针右移加一
            cmp     [bx+6], al
            jne     s15
            call    print4               ;绘制4
            jmp     s1d                  ;打印秒钟值的第二位
s15:     inc     al                   ;字符指针右移加一
            cmp     [bx+6], al
            jne     s16
            call    print5               ;绘制5
            jmp     s1d                  ;打印秒钟值的第二位
s16:     inc     al                   ;字符指针右移加一
            cmp     [bx+6], al
            jne     s17
            call    print6               ;绘制6
            jmp     s1d                  ;打印秒钟值的第二位
s17:     inc     al                   ;字符指针右移加一
            cmp     [bx+6], al
            jne     s18
            call    print7               ;绘制7
            jmp     s1d                  ;打印秒钟值的第二位
s18:     inc     al                   ;字符指针右移加一
            cmp     [bx+6], al
            jne     s19
            call    print8               ;绘制8
            jmp     s1d                  ;打印秒钟值的第二位
s19:     call    print9               ;绘制9
;打印秒钟的第二位数:
s1d:
           mov     rowshft,    65       ;设置行为65
           mov     colshft,    250      ;设置列为250
           call    print_black           ;设置背景为黑色
           mov     al,     '0'
           cmp     [bx+7], al
           jne     s21
           call    print0               ;绘制0
           jmp     s2d                  ;打印AM或者PM
s21:    inc     al                  ;字符指针右移加一
           cmp     [bx+7], al
           jne     s22
           call    print1               ;绘制1
           jmp     s2d                  ;打印AM或者PM
s22:    inc     al                   ;字符指针右移加一
           cmp     [bx+7], al
           jne     s23
           call    print2               ;绘制2
           jmp     s2d                  ;打印AM或者PM
s23:    inc     al                   ;字符指针右移加一
           cmp     [bx+7], al
           jne     s24
           call    print3               ;绘制3
           jmp     s2d                  ;打印AM或者PM
s24:     inc     al                   ;字符指针右移加一
            cmp     [bx+7], al
            jne     s25
            call    print4               ;绘制4
            jmp     s2d                  ;打印AM或者PM
s25:     inc     al                   ;字符指针右移加一
            cmp     [bx+7], al
            jne     s26
            call    print5               ;绘制5
            jmp     s2d                  ;打印AM或者PM
s26:     inc     al                   ;字符指针右移加一
            cmp     [bx+7], al
            jne     s27
            call    print6              ;绘制6
            jmp     s2d                  ;打印AM或者PM
s27:     inc     al                   ;字符指针右移加一
            cmp     [bx+7], al
            jne     s28
            call    print7               ;绘制7
            jmp     s2d                  ;打印AM或者PM
s28:     inc     al                   ;字符指针右移加一
            cmp     [bx+7], al
            jne     s29
            call    print8               ;绘制8
            jmp     s2d                  ;打印AM或者PM
s29:     call    print9             ;绘制9
;打印AM或者PM:
s2d:
            mov     rowshft,    125      ;设置行为125
            mov     colshft,    245        ;设置列为245
            cmp     amflag,     1       ;判断“am”的标志是否是正确的
            jne     pp
            mov     fontcolor,  0         ;设置颜色为黑色
            call    printP
            mov     fontcolor,  31        ;设置颜色为白色
            call    printA               ;打印A
            jmp     mp
pp:      mov     fontcolor,  0         ;设置颜色为黑色
            call    printA              ;打印A
            mov     fontcolor,  31       ;设置颜色为白色
            call    printP               ;打印P
mp:      mov     rowshft,    125 ;设置行为125
            mov     colshft,    260 ;设置列为260
            call    printM               ;打印M
            pop     ds
            iret
time_int            endp
;绘制1:
print1 proc
mov ax, colshft
mov tmpcol1, 20
add tmpcol1, ax ;列值tmpcol1=20的地方画竖线
mov tmpcol2, 30
add tmpcol2, ax ;列值tmpcol2=30的地方画竖线
mov ax, rowshft
mov tmprow1, 0
add tmprow1, ax ;行值tmprow1=0 的地方画横线
mov tmprow2, 20
add tmprow2, ax ;行值tmprow2=20的地方画横线
mov tmprow3, 50
add tmprow3, ax ;行值tmprow3=50的地方画横线
draw_row tmprow1, tmpcol1, tmpcol2, fontcolor
draw_column tmpcol2, tmprow1, tmprow3, fontcolor

ret ;返回调用处
print1 endp
;绘制冒号:
print_colon         proc
             mov     ax,         colshft
             mov     tmpcol1,    8
             add     tmpcol1,    ax                                       ;列值tmpcol1=8 的地方画竖线
             mov     tmpcol2,    12
             add     tmpcol2,    ax                                        ;列值tmpcol2=12的地方画竖线
             mov     ax,         rowshft
             mov     tmprow1,    16
             add     tmprow1,    ax                                        ;行值tmprow1=16的地方画横线
             mov     tmprow2,    20
             add     tmprow2,    ax                                        ;行值tmprow2=20的地方画横线
draw_row    tmprow1,  tmpcol1,  tmpcol2,  fontcolor    ;在行16上画线
draw_row    tmprow2,  tmpcol1,  tmpcol2,  fontcolor    ;在行20上画线 
draw_column  tmpcol1,  tmprow1,  tmprow2,  fontcolor    ;在列8 上画线
draw_column  tmpcol2,  tmprow1,  tmprow2,  fontcolor    ;在列12上画线
             mov     ax,         colshft
             mov     tmpcol1,    8
             add     tmpcol1,    ax                                          ;列值tmpcol1=8 的地方画竖线
             mov     tmpcol2,    12
              add     tmpcol2,    ax                                          ;列值tmpcol2=12的地方画竖线
             mov     ax,         rowshft
             mov     tmprow1,    30
             add     tmprow1,    ax                                          ;行值tmprow1=30的地方画横线
             mov     tmprow2,    34
             add     tmprow2,    ax                                         ;行值tmprow2=34的地方画横线
draw_row        tmprow1,    tmpcol1,    tmpcol2,    fontcolor    ;在行30上画线
draw_row        tmprow2,    tmpcol1,    tmpcol2,    fontcolor    ;在行34上画线  
draw_column     tmpcol1,    tmprow1,    tmprow2,    fontcolor    ;在列8 上画线
draw_column     tmpcol2,    tmprow1,    tmprow2,    fontcolor    ;在列12上画线
ret                                                              ;返回调用处
print_colon 
;绘制A:
printA proc
mov ax, colshft
mov tmpcol1, 0
add tmpcol1, ax ;列值tmpcol1=0 的地方画竖线
mov tmpcol2, 10
add tmpcol2, ax ;列值tmpcol2=10的地方画竖线
mov ax, rowshft
mov tmprow1, 0
add tmprow1, ax ;行值tmprow1=0 的地方画横线
mov tmprow2, 7
add tmprow2, ax ;行值tmprow2=7 的地方画横线
mov tmprow3, 20
add tmprow3, ax ;行值tmprow3=20的地方画横线
draw_row tmprow1, tmpcol1, tmpcol2, fontcolor ;在行0 上画线
draw_row tmprow2, tmpcol1, tmpcol2, fontcolor ;在行7 上画线
draw_column tmpcol1, tmprow1, tmprow3, fontcolor ;在列0 上画线
draw_column tmpcol2, tmprow1, tmprow3, fontcolor ;在列10上画线
ret ;返回调用处
printA endp
;窗口刷新涂黑:
print_black proc
mov ax, colshft
mov tmpcol1, 0
add tmpcol1, ax ;列值tmpcol1=0 的地方画竖线
mov tmpcol2, 30
add tmpcol2, ax ;列值tmpcol2=30的地方画竖线
mov ax, rowshft
mov tmprow1, 0
add tmprow1, ax ;行值tmprow1=0 的地方画横线
mov tmprow2, 20
add tmprow2, ax ;行值tmprow2=20的地方画横线
mov tmprow3, 50
add tmprow3, ax ;行值tmprow3=50的地方画横线
draw_row tmprow1, tmpcol1, tmpcol2, 0 ;在行0 上画线
draw_row tmprow2, tmpcol1, tmpcol2, 0 ;在行20上画线

draw_row tmprow3, tmpcol1, tmpcol2, 0 ;在行50上画线

draw_column tmpcol1, tmprow1, tmprow3, 0 ;在列0 上画线
draw_column tmpcol2, tmprow1, tmprow3, 0 ;在列30上画线 ret ;返回调用处
print_black endp
;保存向量:
             mov     ah,     35h            ;把十六进制数35h放到通用寄存器ax的高8位
             int     21h              ;产生一个软中断并把控制转向一个类型号为21h的软中断
             mov     [di],   bx             ;将通用寄存器的值复制到偏移地址为di内存单元中
             mov     [di+2], es            ;将段存储器的值复制到偏移地址为di+2内存单元中
             mov     dx,     [si]         ;把偏移地址为si内存单元里的内容复制到通用寄存器
             push    ds                 ;将通用存储器中的值压入栈中
             mov     ds,     [si+2]       ;把偏移地址为si+2内存单元里的内容复制到段寄存器
             mov     ah,     25h          ;把十六进制数25h放到通用寄存器ax的高8位
             int     21h
             pop     ds                  ;将堆栈口的数据推出到段寄存器中
             ret                         ;返回调用处
setup_int           endp
;主程序:
main proc
mov ax, @data        ;将一个内部RAM的地址赋给通用存储器
mov ds, ax ;设置初始化段寄存器
             mov     ah,     0             ;设置模式   
             mov     al,     13h           ; 320x200 256
             int     10h
             mov     ah,     0             ;设置模式   
             mov     al,     13h           ; 320x200 256
             int     10h
             mov     new_vec,    offset  time_int ;回送时间变量到新建向量地址计算出相应的地址偏移
             mov     new_vec+2,  seg     time_int ;将时间基址放入新建向量地址
             lea     di,     old_vec      ;通用寄存器指向向量缓冲区
             lea     si,     new_vec      ;通用寄存器指向新的向量
             mov     al,     1ch          ;计时器中断
             call    setup_int            ;设置新的中断向量
             mov     ah,     0
             int     16h
             lea     di,     new_vec      ;通用寄存器指向向量缓冲区
             lea     si,     old_vec      ;通用寄存器指向新的向量
             mov     al,     1ch          ;计时器中断
             call    setup_int            ;存储旧的向量
             mov     ah,     0            ;将0移动到寄存器ah中
             mov     al,     3           ;将3传输到寄存器al中
             int     10h
            mov ah, 4ch      ;返回
            int 21h     ;回dos系统
            main endp

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

相关推荐