assume cs:code,ds:date
date segment
dw 16 dup(0)
date ends
code segment
start:
mov ax,date
mov ds,ax
mov si,0
mov dx,0013h
mov ax,2884h
call dwordtoc
mov dh,0
mov dl,0
mov cx,2
call show_str
mov ax,4c00h
int 21h
;the shor_str
;the intruduction of the show_str
;名称:SHOW_STR
;功能:在指定的的位置,指定的颜色,显示一个用0结束的字符串
;参数 (dh)=行号 (取值范围0-24) (dl)=列号(取值范围0-79) (cl)=颜色 ds:si 指向字符串首地址
;返回值: none
show_str:
;save the register values
push es
push ax
push cx
push dx
push di
;work out the addess
mov al,160
mov ah,0
mul dh
mov di,ax
mov al,2
mov ah,0
mul dl
add di,ax
mov ax,0b800h
mov es,ax
mov al,cl ;get the attribute
write:
mov cl,[si]
mov ch,0
jcxz ok
mov es:[di],cl
mov es:[di+1],al
add di,2
inc si
jmp short write
ok:
pop di
pop dx
pop cx
pop ax
pop es
ret
;-------end of show_str
;dwordtoc
;功能 将dword型数转变为表示十进制的字符串,字符串以0为结尾符
;参数 (ax)=dword型数据的低16位 (dx)=dword型数据的高16位
; ds:si 指向字符串的首地址
;返回 无
dwordtoc:
;各种寄存器的保存
push si
push di
push cx
push dx
push bx
mov di,0 ;用来保存字符的长度
change:
mov cx,10
call divdw ;呼叫不溢出除法
add cx,30h
push cx
inc di ;将余数入栈,并增加字符计数
mov cx,dx
jcxz ok0 ;判断高位商是否为0,不为0直接再chnange
jmp short change
ok0:
mov cx,ax
jcxz ok1 ;判断低位商是否为0
jmp short change
ok1:
mov cx,di
write_str:
pop bx
mov [si],bl
inc si
loop write_str
mov [si],0 ;字符后加0为结束符
;寄存器出栈
pop bx
pop dx
pop cx
pop di
pop si
ret
;-------------------end of dwordtoc
; the divdw
; 功能:进行不会产生除法溢出的运算,被除数为dword型,除数为word型,结果为dword型
;参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
;返回值 :(dx)=结果的高16位,(ax)=结果的低16位 (cx)=余数
divdw:
;保存寄存器的值
push bx
push ax ;低位入栈保存
;构造高位除法
mov ax,dx
mov dx,0
div cx ;除法运算后,dx存放高位的余数,ax 存入高位的商
mov bx,ax ;将高位商存入bx
pop ax ;低位出栈, 此时dx中存放着高位除法运算后的余数
div cx ; 运算后,ax存放着低位的商,dx存放着低位的余数.-->即为整个除法运算的余数
mov cx,dx ;将余数存入cx
mov dx,bx ;高位商存入dx
;寄存器恢复
pop bx
ret
; divdw ...ends
code ends
end start
- [qingpengchen2011] 我的子程序是没错的,我在想是不是虚拟机的问题 08/08 12:17
- [qingpengchen2011] 嗯~行。我再认真详细看看,谢谢咯 08/08 10:38
- [tomato] 我运行了,不是地址的问题。也没有出现崩溃的现象,不过有的子程序功能好像不太对。子程序书中都有,建议你 08/07 22:07
- [tomato] 还是不行吗?我帮你看一下。 08/07 21:29
- [qingpengchen2011] table等标志的值都是在此安装程序中的偏移地址,所以那些子程序等等的地址都是要重新计算的。这点我倒 08/07 18:10
- [qingpengchen2011] table dw sub0-int7ch+200h,sub1-int7ch+200h,sub2-in 08/07 18:06
- [qingpengchen2011] table dw sub0-int7ch+200h,sub1-int7ch+200h,sub2-in 08/07 18:06
- [tomato] 结果也贴上来晾凉吧。 08/05 23:49
- [tomato] 我看不是死循环的问题,是子程序入口地址错了。告诉你一个解决思路,就是单步跟踪读取子程序地址那个地方, 08/05 23:45
- [tomato] 很有可能是你程序的问题,检查一下是不是死循环了。 08/05 23:41
[ 游客 发表于 2011-08-02 17:33 ]
继续想课程设计1前进