首先谢谢这位大大的回答。
我没写在问题贴的一个原因是我还没看完小甲鱼的关于这一段的课程,先暂时做个记录,看看能不能独立完成。放在作业贴是觉得会来看的应该是同样在做这一道题的童鞋,这样能得到同一层次的思考和反馈,不至于产生依赖。
我是看完小甲鱼视频再回来修改后才看到大大的回答的,我很认同大大的回答。
这里贴一下修改后的代码,修改后能直接运行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,3
mov cl,2
call show_str
mov ax,4c00H
int 21h
dtoc:
push dx
push cx
push ax
push si
push bx
mov bx,0;bx子程序中存放位数,用栈临时存放修改后的字符
s0:
mov cx,10d;d表示十进制
mov dx,0;这里小甲鱼的视频里确实做了dx的初始化,说明正如@人造人 所说,问题出在这
div cx;
mov cx,ax;所得商给cx
jcxz s2;当商为0跳到s2
add dx,30H;余数加上30h得到相应的ASCII码
push dx
inc bx;存储位数
jmp short s0
s2:
add dx,30H
push dx
inc bx;再进行一次栈操作(补充当“商为零而余数不为零“的情况)
mov cx,bx;总共有bx位进栈了,所以循环次数为bx
mov si,0
s3:
pop ax
mov [si],al
inc si
loop s3
okay:
pop bx
pop si
pop ax
pop cx
pop dx
ret
show_str:;借用实验9的代码
push bx
push cx
push si
mov al,160
dec dh
mul dh
add dl,dl;显存的奇数字节为字的内容,偶数为字的外观属性,所以要列地址*2作为显存地址
add al,dl
mov bx,ax
mov ax,0B800H;显存位置
mov es,ax
mov di,0
mov al,cl
mov ch,0
s: mov cl,[si]
jcxz ok
mov es:[bx+di],cl
mov es:[bx+di+1],al
inc si
add di,2
jmp short s
ok:
pop si
pop cx
pop bx
ret
code ends
end start
最后我想了一下,确实不应该在作业贴里问问题,毕竟鱼c作为一个开放的平台,应该把内容分类好方便更多的鱼油。 |