|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 远山 于 2016-4-28 19:36 编辑
assume cs:code,ds:data,ss:stack
data segment
db 10 dup (0)
data ends
stack segment
db 16 dup (0)
stack 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 ax
push cx
push dx
push si ;用入栈指令来保存子程序中所用到的寄存器的内容。
mov si,4 ;因为12666连续除以10所取得余数的顺序依次为66621,与我们所需要的相反,故si赋值为4,然后再减1定位到前一位,以此类推。
s:mov dx,0 ;初始化dx(我在想不初始化可不可以,一会试试)
mov cx,10
div cx ;ax/cx,商放在ax中,余数放在dx中。
add dl,30h ;将余数6与30h相加得到6对应的ASCII码。
mov ds:[si],dl ;将ASCII码放入数据段的内存字节中。
sub si,1 ;si-1,定位到前一字节。
mov cx,ax ;将商转存到cx中,用于jccxz指令判断商是否为零。
jcxz s0 ;若cx=0,即商为零,则跳转,反之,继续执行。
jmp short s ;无条件跳转。
s0:pop si
pop dx
pop cx
pop ax
ret ;取出寄存器值,返回主程序。
show_str:push ax
push bx
push cx
push dx
push si
push di
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bX,ax
mov ax,0b800h
mov es,ax
mov di,0
mov ah,cl
t:mov ch,0
mov cl,ds:[si]
jcxz t0
mov es:[bx+di],cl
mov es:[bx+1+di],ah
inc si
add di,2
jmp short t
t0:pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
第二个子程序有问题,本来应该在第八行显示,结果在第四行显示了,至于问题在哪我还没有找出来,路过的朋友有时间帮着看一下 |
|