|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 haiouda 于 2015-5-2 23:34 编辑
- <p>assume cs:code ,ss:stack, ds:data
- data segment
- dd 123,12666,1,8,3,38
- dw 11 dup(0)
- data ends
- stack segment
- dw 16 dup(0)
- stack ends
- code segment
- start: mov ax,data
- mov ds,ax
-
- mov ax,stack
- mov ss,ax
- mov sp,33
-
-
-
- mov si,0
- mov di,31
-
- call dtoc ;转换并存入内存指定位置
-
-
- W1: call show_str ;显示
-
-
-
-
-
- mov ax,4c00h
- int 21h
-
- dtoc: mov cx,6 ;共有6个数据
- w0: push cx ;外层循环,每次对一个数据进行操作
- mov ax,[si] ;读数据
- add si,2
- mov dx,[si]
- add si,2 ;si 指向下一个数据
-
- s0: call divdw
- mov ds:[26],ax ;保护被除数低16位
-
-
- push cx ; 余数入栈(从低位到高位顺序入栈)
- mov ax,ds:[24]
- inc ax ;这个内存单元用来记录入栈次数即数值长度
- mov ds:[24],ax
-
- mov ax,ds:[26]
- inc cx ;
- or cx,ax ;商和余数同时为零,即此数据被分解完毕
- loop s0 ;余数为零,代表这个数已经按从低到高入栈完毕
-
- mov cx,ds:[24] ;数值长度给cx用于循环次数
- mov word ptr ds:[24],0
-
-
- pop ax ;数据个个位倒序出栈
- mov [di],al
- inc di
- dec cx ;每串数都以零开头,所以第一个数(0)不加30h,同时cx减少一次循环
-
- s1: pop ax
- add al,30h ;每位改成ASICII码
- mov [di],al
- inc di
- loop s1
-
-
-
- pop cx
- loop w0
- mov byte ptr [di],0 ; 因为每组数字都以零开头,补个零结尾,这样要显示的数字实际开始位置为,ds:[32]
- ret
-
-
-
- divdw: push bx
- push ax ;除法子程序(ax被除数低16位 dx被除数高16位 cx余数)
-
- mov cx,10
-
- mov ax,dx
- mov dx,0
- div cx ;高16位作除法
-
- mov bx,ax ;ax高16位的商,dx余数
-
-
- pop ax
- div cx ;低16位作除法
-
-
- mov cx,dx
- mov dx,bx
-
- pop bx
- ret
-
-
- show_str: mov ax,0b800h ;显示字符串
- mov es,ax
- mov ax,0
-
- mov al,8 ;显示位置,第九行
- mov cl,2 ; 第三例
-
- mov bx,0
- mov bl,160
- mul bl
- mov bx,0
- add bx,ax
- mov ax,0
- mov al,2
-
- mul cl
- add bx,ax ;bx为首字偏移值
-
-
- mov ch,2 ; 颜色为绿色
-
- mov al,ch ;颜色放al中保存
- mov di,0
- mov cx,6
- mov si,32
-
-
- w2: push cx
- call show_str11
- pop cx
- inc si ;指向下一个字符
- add di,2 ;显示二个数字之间加个空格,di必须为2的倍数
- loop w2
-
- ret
-
-
-
-
- show_str11:
- mov cl,[si]
- mov ch,0
- jcxz w3 ;cx为零时 跳到s1
-
-
-
- mov es:[bx+di],cl
- mov es:[bx+di+1],al
-
- inc si
- add di,2
-
-
- jmp short show_str11
-
-
-
- w3: ret
- code ends
- end start</p>
复制代码
|
|