求助大佬,下面这个汇编源代码存在什么问题,没有办法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
求助大佬,汇编小白有问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-