10.3实验题求解
本帖最后由 猪好大 于 2012-3-31 19:18 编辑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,2
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:mov cx,10
div cx ;除10
add dl,30H ;余数加30H得字符
mov ds:,dl ;放入内存中
inc si ;自增1
mov dx,0 ;清零
mov cx,ax ;为下步跳转检验
jcxz ok
jmp short dtoc ;循环
ok: mov ds:,al ;加个结速符号0
ret
show_str:mov bp,0
mov bx,cx ;cx放的是绿色用来显示出来
mov ax,0b800h ;显存为置
mov es,ax ;显存位置给ES
mov ax,0 ;Ax清零
mov al,0A0h ;显存一行80字符 a0相当于第二行起址位
mul dh ;*dh得第9行起址位
mov si,ax ;第9行起址位给了SI
mov ax,0
mov al,2 ;一列2个字节
mul dl
add si,ax ;列+行起址位得到要真正要输入的位置
mov di,0
mov cx,0
push cx ;为pop的时候数到31H即1以后结束准备
to: mov cl,ds: ;把ds:0地址内的数给CL 即第一个数36H
jcxz go ;判CX是否为零掉转
push cx ;放入栈
inc di ;di自增入next 36 >36>32>31>0 到0跳出
jmp short to ;循环
go: pop cx ;先入后出31>32>36?36>36>0
jcxz home ;判断跳转
mov es:,cl ;将CL的数据存入显存为址
mov es:,bl ;将色填入去
add bp,2 ;加二到下一个数填写位置
jmp short go ;循环
home:ret
code ends
end start
程序在debug里面没有益出但在外边exe的时候overflow
求高手解答一下和指出那地方出错了 实验目的是将12666数字求出字符 1 2 6 6 6 并将其用绿色在9行3列显示出来
本帖最后由 莫名其妙 于 2012-3-31 14:45 编辑
是除法溢出么?稍微改了几个地方 就是不规则的突出的地方
start : mov ax,12666
mov bx ,data
mov ds,bx
mov si,0
mov bx,10
mov dx,0
call dtoc
mov dh,8
mov dl,2
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc: div bx;除10
add dl,30H;余数加30H得字符
mov ds:,dl;放入内存中
inc si;自增1
mov dx,0;清零
mov cx,ax;为下步跳转检验
jcxz ok
jmp short dtoc;循环
ok: mov ds:,al;加个结速符号0
ret
莫名其妙 发表于 2012-3-31 13:47 static/image/common/back.gif
是除法溢出么?稍微改了几个地方 就是不规则的突出的地方
没有除法益出,我是在CMD运行exe的时候益出的,但在调试的时候没有益出 楼主,代码用代码格式编辑下
你的代码复制过来有些问题!!!!!!
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,2
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:mov cx,10
div cx ;除10
add dl,30H ;余数加30H得字符
mov ds:,dl ;放入内存中
inc si ;自增1
mov dx,0 ;清零
mov cx,ax ;为下步跳转检验
jcxz ok
jmp short dtoc ;循环
ok: mov ds:,al
ret
show_str:mov bp,0
mov bx,cx ;cx放的是绿色用来显示出来
mov ax,0b800h ;显存为置
mov es,ax ;显存位置给ES
mov ax,0 ;Ax清零
mov al,0A0h ;显存一行80字符 a0相当于第二行起址位
mul dh ;*dh得第9行起址位
mov si,ax ;第9行起址位给了SI
mov ax,0
mov al,2 ;一列2个字节
mul dl
add si,ax ;列+行起址位得到要真正要输入的位置
mov di,0
mov cx,0
push cx ;为pop的时候数到31H即1以后结束准备
to: mov cl,ds: ;把ds:0地址内的数给CL 即第一个数36H
jcxz go ;判CX是否为零掉转
push cx ;放入栈
inc di ;di自增入next 36 >36>32>31>0 到0跳出
jmp short to ;循环
go: pop cx ;先入后出31>32>36?36>36>0
jcxz home ;判断跳转
mov es:,cl ;将CL的数据存入显存为址
mov es:,bl ;将色填入去
add bp,2 ;加二到下一个数填写位置
jmp short go ;循环
home:ret
code ends
end start
wAterLoo 发表于 2012-3-31 16:13 static/image/common/back.gif
楼主,代码用代码格式编辑下
你的代码复制过来有些问题!!!!!!
有问题可能那些解释 猪好大 发表于 2012-3-31 16:29 static/image/common/back.gif
有问题可能那些解释
要不你干脆把注释去掉- - ,然后编译通过后再发上来
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,2
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:mov cx,10
div cx
add dl,30H
mov ds:,dl
inc si
mov dx,0
mov cx,ax
jcxz ok
jmp short dtoc
ok: mov ds:,al
ret
show_str:mov bp,0
mov bx,cx
mov ax,0b800h
mov es,ax
mov ax,0
mov al,0A0h
mul dh
mov si,ax
mov ax,0
mov al,2
mul dl
add si,ax
mov di,0
mov cx,0
push cx
to: mov cl,ds:
jcxz go
push cx
inc di
jmp short to
go: pop cx
jcxz home
mov es:,cl
mov es:,bl
add bp,2
jmp short go
home:ret
code ends
end start
wAterLoo 发表于 2012-3-31 16:36 static/image/common/back.gif
要不你干脆把注释去掉- - ,然后编译通过后再发上来
搞点了,编译通过了用debug调式没有发生everflow 量是在CMD运行就everflow了 猪好大 发表于 2012-3-31 17:47 static/image/common/back.gif
搞点了,编译通过了用debug调式没有发生everflow 量是在CMD运行就everflow了
解说在程序里面
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start : ;xor dx,dx
mov ax,12666
mov bx ,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,2
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:;这里给你一个建议,尽量将用到的寄存器Push进栈,函数结束的时候再pop回来
xor dx,dx ;清0,保证DH不受上一次影响,你想想如果你在调用dtoc的时候
mov cx,10 ;dx不为0会怎么样呢?本来你的数据12666 = 317AH
;但是如果dx为FFFF,这时候你的操作就是
;FFFF,317A / 10 = FFFF317 所以会产生溢出
;由于debug模式的调试机制,会对寄存器默认初始为0
;但是直接运行是不会的
div cx ;你也可以把xor dx,dx 放到start:后面,你会发现程序也会正常运行
add dl,30H ;但是不推荐这样做,至于为什么你以后会懂得 - -
mov ds:,dl
inc si
mov dx,0
mov cx,ax
jcxz ok
jmp short dtoc
ok: mov ds:,al
ret
show_str:mov bp,0
mov bx,cx
mov ax,0b800h
mov es,ax
mov ax,0
mov al,0A0h
mul dh
mov si,ax
mov ax,0
mov al,2
mul dl
add si,ax
mov di,0
mov cx,0
push cx
to: mov cl,ds:
jcxz go
push cx
inc di
jmp short to
go: pop cx
jcxz home
mov es:,cl
mov es:,bl
add bp,2
jmp short go
home:ret
code ends
end start
谢谢版主和莫名其妙,原来是DX置零,俺明白了谢谢解答
页:
[1]