实验10.3代码
本帖最后由 ckzmo 于 2011-3-6 13:11 编辑题目就是吧12666显示在8行3列绿字
终于调试出来了assume cs:code
data segment
db 10 dup(0)
data ends
code segment
start:mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:push bx
s: mov dx,0
mov cx,10d
div cx
mov cx,ax
jcxz t
add dx,30h
mov ds:,dx
push dx
inc si
mov bx,si
jmp short s
t: add bx,1
mov cx,bx
mov si,0
add dx,30h
s1: mov ds:,dx
pop dx
inc si
loop s1
mov si,0
ret
show_str:mov al,0a0h
dec dh
mul dh
mov bx,ax
mov al,2
mul dl
sub ax,2
add bx,ax
mov dx,0b800h
mov es,dx
mov di,0
mov al,cl
s2:mov cl,ds:
mov ch,0
jcxz x
mov es:,cl
mov es:,al
inc si
add di,2
jmp short s2
x:ret
code ends
end start 首先
mov ax,4c00h
int 21h ;少了个h
不过通过了没正常显示.再看看. 本帖最后由 china0008 于 2011-3-5 23:52 编辑
源码来了。你自己分析下。
有疑问再提问。assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:
push ax
push bx
push cx
push dx
push si
mov bx,0
zh: mov cx,10
mov dx,0
div cx
add dx,30h
push dx
inc bx
mov cx,ax
inc cx ;针对首位为1的数值对循环次数的影响。其他首位值不受影响。
loop short zh
mov cx,bx ;把显示数值的位数传递给cx
mov si,0
px: pop ax
mov ,al
inc si
loop short px
pop si
pop dx
pop cx
pop bx
pop ax
ret
show_str: ;提供 行/列/属性 即可显示
push cx
push si
mov ax,0b800h
mov es,ax ;显存0页段地址
dec dh
dec dl ;因为行列都是从0开始数。所以行和列都减1
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax ;计算首字地址
mov di,0 ;显存偏移变量
mov al,cl
mov ch,0 ;用al存储显示属性,CX用于显示字符和判断0的出现。
s:mov cl,ds:
jcxz ok
mov es:,cl
mov es:,al
inc si
add di,2
jmp short s
ok:pop si
pop cx
ret
code ends
end start assume cs:code
data segment
db 10 dup(0)
data ends
code segment
start:mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:
push bx
push si
s:
mov dx,0 ;s循环是把12666分别除以10取的余数放进ds:中
mov bx, 0aH
div bx
add dx, 30H
push dx
mov cx, ax
inc di
jcxz t
jmp s
t: mov cx, di ;要循环的次数给CX
s1:
;S1循环就是把DS:中的数加上30H
pop dx
mov , dl
inc si
loop s1
mov dl, 0
mov , dl
pop si
pop bx
ret
show_str:
mov al,0a0h
;dec dh ;行
mul dh
mov bx,ax
mov al,2 ;列
mul dl
;sub ax,2
add bx,ax
mov dx,0b800h
mov es,dx
mov di,0
mov ah,cl
s2:mov cl,ds:
mov ch,0
jcxz x
mov al,ds:
mov es:,ax
;mov es:,al
inc si
add bx,2
jmp short s2
x:ret
code ends
end start 哎呀,12点了.改了一个小时,技术差....有几句偶不明白的地方,给你注释掉了.用栈的方式存储,其他的地方没动.
其实ds:,默认关联的.不需要显示表示,直接就可以的吧
上面版主也给了代码了. 我的答案编辑在1楼了 谢谢版主的帮忙
页:
[1]