|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 泡泡 于 2014-10-21 02:59 编辑
实验10.3
用debug32调试结果正确,直接运行结果不对。
那个可以提供一下,解决问题的思路?
注:调试运行,就算用g 命令跳着运行结果也正确。
汇编代码如下:- assume cs:code
- date segment
- db 20h dup(0)
- date ends
- stack segment
- db 20 dup(0)
- stack ends
- code segment
- start:mov ax,1266
- mov bx,date
- mov es,bx
- mov si,0
- mov bx,stack
- mov ss,bx
- mov sp,20h
- call dtoc
-
- mov dx,es
- mov ds,dx
- mov dh,8
- mov dl,3
- mov cl,2
- call show_str
- mov ax,4c00h
- int 21h
-
- ;显示字符 子程序
- ;在屏幕上 第8行(dh),3列(dl) 开始显示字符,颜色为(cl),数据来源来ds段中
- show_str:push dx
- push sp
- push bx
- push cx
- push es
- push si
- ;每行占0a0h个字节 25行80列 计算好偏移存至bp中
- mov ah,0
- mov al,0a0h
- mul dh
- mov bp,ax
- mov ah,0
- mov al,2
- mul dl
- add bp,ax
-
- mov ax,0b800h ;显存基址
- mov es,ax
- mov bx,0
- mov si,0
- mov ah,cl ;颜色
- mov ch,0
- s:mov cl,[bx];
- jcxz ok ;if(cx == 0)jcxz ok
- mov al,cl
- mov es:[si + bp],ax
- add bx,1 ;+1 、+2 加的都是字节数
- add si,2
- jmp near ptr s
-
- ok:pop si
- pop es
- pop cx
- pop bx
- pop sp
- pop dx
- ret
- divdw:nop ;子程序实现除法功能
- nop ;被除数ax(低位1000) dx(高位1) 表示11000h 除数bx 表示1
- nop ;返回:ax存低位商,dx存放高位商,cx存余数
- push es
- push ds
- mov ds,ax
- mov es,dx
- mov ax,dx
- sub dx,dx
- div bx
- mov es,ax ;临时结果高位商:es
- mov ax,ds
- div bx
- mov cx,dx ;余数
- mov dx,es ;最终返回的高位商
-
- pop ds
- pop es
- ret ;返回 商ax,dx, 余数cx
- dtoc:nop ;将ax中的数据转化成十进制字符,存至数据段中。将数据存储在es段中。
- ;参数来自己ax,下次再实现参数来自己内存
- push cx
- push dx
- push bx
- push si
-
- mov si,0
- mov bx,0ah
- dc:mov cx,ax
- jcxz near ptr dhh
- call divdw
- add cx,30h
- push cx
- inc si
- jmp near ptr dc
-
- dhh:mov cx,si
- mov bx,0
- dh3:nop
- ;pop word ptr es:[bx]
- pop ax
- mov es:[bx],al
- add bx,1
- loop dh3
-
- pop si
- pop bx
- pop dx
- pop cx
- ret
-
- code ends
- end start
复制代码
|
|