|

楼主 |
发表于 2020-4-12 14:45:57
|
显示全部楼层
首先谢谢这位大大的回答。
我没写在问题贴的一个原因是我还没看完小甲鱼的关于这一段的课程,先暂时做个记录,看看能不能独立完成。放在作业贴是觉得会来看的应该是同样在做这一道题的童鞋,这样能得到同一层次的思考和反馈,不至于产生依赖。
我是看完小甲鱼视频再回来修改后才看到大大的回答的,我很认同大大的回答。
这里贴一下修改后的代码,修改后能直接运行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作为一个开放的平台,应该把内容分类好方便更多的鱼油。 |
|