实验14,我写的程序达不到要求,但是我不知道错在那里了。
assume cs:codeds1 segment
db '/',':'
ds1 ends
code segment
start:mov si,160*12+40*2
mov ax,0b800h
mov es,ax
mov ax,ds1
mov ds,ax
mov bx,0
mov cx,3
mov al,9
call s
mov al,4
mov cx,3
call s1
mov ax,4c00h
int 21h
s: push cx
push ax
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov es:,ah
mov es:,al
pop ax
add si,6
dec al
pop cx
dec cx
jcxz send
jmp s
send: mov ax,ds:
mov es:,ax
mov es:,ax
ret
s1: push cx
push ax
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov es:,ah
mov es:,al
pop ax
add si,6
sub al,2
pop cx
dec cx
jcxz s1end
jmp s1
s1end: mov ax,ds:
mov es:,ax
mov es:,ax
ret
code ends
end start大家帮我找找那里又问题,结果总是让我输入新的时间。而不是显示。
子程序应该用xxxproc
..........
xxxendp
定义的 本帖最后由 flyue 于 2011-9-29 18:03 编辑
proc,和endp是什么指令啊,为什么要用这个定义子程序才可以
加进去编译的时候显示Operand must be type specifier,操作数必须类型说明报警。
用Call说明代码不在一个段,如果不定义子程序那你就把代码定义在一个段内用JMP CALL可以进行段内近转移啊。CALL S就是段内近转移,JMP NEAR S。这个段内转移啊。所以不应该存在你说的不在一个段的问题 在代码规范方面,你得下些功夫! assume cs:code
ds1 segment
db '/',':'
ds1 ends
code segment
start:
mov si,160*12+40*2
mov ax,0b800h
mov es,ax
mov ax,ds1
mov ds,ax
mov bx,0
mov cx,3
mov al,9
;取日期
call s
mov al,4
mov cx,3
call s1
mov ah,1
int 21h
mov ax,4c00h
int 21h
s: push cx
push ax
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov es:.0,ah
mov es:.2,al
pop ax
add si,6
dec al
pop cx
dec cx
jcxz s_end
jmp s
s_end:
mov al,ds:
;因为直接写入显存中,一个字符占两个字节。
;yy/mm/dd
;01 23 45 67 89 AB CD EF
mov es:,al
mov es:,al
;这里用ax相当于把“/”的高位也传进显存中。“/”的颜色受ah影响
ret
s1:
push cx
push ax
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
mov es:.0,ah
mov es:.2,al
pop ax
add si,6
sub al,2
pop cx
dec cx
jcxz s1end
jmp s1
s1end:
mov al,ds:
mov es:,al
mov es:.2,al
ret
code ends
end start修改好了,你自己对比吧! mov ah,1
int 21h
mov ax,4c00h
int 21h
mov ah,1
int 21h
这是按任意键继续。和上面没关系! ;实验14:编程,以“年/月/日 时:分:秒” 的格式,显示当前日期、时间
assume cs:code
code segment
start:
mov ax,0b800h
mov ds,ax
mov di,12*160+80-18 ;设置显示位置
mov dh,2 ;设置显示属性
mov al,9
mov bl,'/'
call readTime
mov al,8
mov bl,'/'
call readTime
mov al,7
mov bl,' '
call readTime
mov al,4
mov bl,':'
call readTime
mov al,2
mov bl,':'
call readTime
mov al,0
mov bl,0
call readTime
mov ax,4c00h
int 21h
showTime:;显示数据,dl为要显示的字符;dh为显示的属性
mov ,dx
add di,2
ret
;参数(al:端口号;bl:附加符号) 功能:读取CMOS RAM的端口(al)的信息,并显示到屏幕上
readTime:
;读取CMOS RAM的端口(al)的信息
out 70h,al
in al,71h
;获取高4位二进制信息
mov ah,al
mov cl,4
shr ah,cl
;获取低4位二进制信息
and al,00001111b
;转换为ASCII码
add ah,30h
add al,30h
mov dl,ah
call showTime
mov dl,al
call showTime
mov dl,bl
call showTime
ret
code ends
end start
页:
[1]