《王爽汇编》第十章实验10-3
虽然看起来简单,但真做起来还是有不少问题的。比如出栈入栈的计数一开始就没有想到。
比如要注意子程序之间寄存器值的相互干扰。。
比如要写好注释,之前写的代码因为没有注释,已经不知道是干什么的了。。
这次用了不少时间,但也算理解的更透彻了一些。
;名称:dtoc
;功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符号。
;参数:(ax)=word型数据
; ds:si指向字符串的首地址
;返回:无
;
;思路:取一个16进制数,连续除以10,余数的倒序就是10进制数。
; 每个余数+30H就是对应ascii码。
assume cs:code
data segment
dw 123,12666,1,8,38
data ends
code segment
start: mov ax,12666
mov bx,data
mov ds,bx
mov si,0 ;设置ds:si
call dtoc ;进制转换
mov dh,8
mov dl,3
mov cl,2
call show_str ;显存写入
mov ax,4c00h
int 21h
dtoc:
push cx
push si
push dx
mov si,0 ;余数计数
mov bx,10 ;除数
dtoc_s0:
mov dx,0
div bx
mov cx,ax
add dx,30h
jcxz dtoc_ok
push dx
inc si
jmp dtoc_s0
dtoc_ok:
push dx
inc si
mov cx,si
mov si,0
dtoc_ok_s1: ;出栈
pop ax
mov ,al
inc si
loop dtoc_ok_s1
pop dx
pop si
pop cx
ret
show_str: ;显示字符的子程序
push ax
push bx
push cx
push dx
push si
;计算行号
dec dh
mov ax,0a0h
mul dh
mov bx,ax
;计算列号
mov ax,2
mul dl
sub ax,2
;行号+列号
add ax,bx
;计算显存首地址
mov bx,8000H
add ax,bx
mov di,ax
mov ax,0b000H
mov es,ax ;es:di
;写入数据
mov bl,cl
mov ch,0
show_str_s0:
mov al,
mov es:,al
mov es:,bl
mov cl,
jcxz show_str_s1
inc si
add di,2
jmp short show_str_s0
show_str_s1:
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
感谢朋友你解决了我遇到的一个重大问题:
子程序show_str 与子程序 dtoc分别独立编写的时候标号我都以随性的命名方法 想到什么就写成什么
结果俩个子程序放到一块的时候有部分标号重复 造成编译错误
看到你的以子程序名为前缀,给子程序标号进行命名的方法,我恍然大悟,终于知道该怎么解决标号冲突的问题了!!
页:
[1]