|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 javanetwork 于 2011-8-17 13:27 编辑
- assume cs:myc,ds:mydat
- mydat segment
- db 128 dup(0)
- dw 123,12666,41,8,3,38
- mydat ends
- mystack segment
- dw 8 dup(0)
- mystack ends
- myc segment
- start:
- mov ax,mystack
- mov ss,ax
- mov sp,10H
- mov ax,mydat
- mov ds,ax
-
-
- mov si,128
- mov di,si
- mov cx,6
- call getword
- mov ax,4c00H;程序出口
- int 21h
-
- getword:
- ;从ds:[si]处获取字型整数,输出到屏幕
- ;参数:cx为欲获取的数据的个数
- push cx
- push si
- push di
-
- mov al,ds:[si]
- mov ah,ds:[si+1]
-
- call wtoa
- push ax
- push dx
- mov dl,12;设置相同的行和列,前一个字符串被覆盖
- mov cl,01101101B
- mov ax,mydat
- mov ds,ax
- mov si,di
- call show_str
- pop dx
- pop ax
-
-
-
- pop di
- pop si
- add si,2
- pop cx
- loop getword
-
-
- ret
-
-
-
- wtoa:
- ;将字型整数以十进制输出;调用divw,不断divw 10取余
- ;参数:ax存放整数
- ;结果:字符串在ds:[di]这个内存地址前面
- sub di,1
- mov cl,0
- mov ds:[di],cl;置字符串尾为\0
- rea:
- mov cx,ax
- jcxz zero;如果ax已经为零了,返回
- mov cl,10
- call divw
- add cl,48;数字转换成字符
- dec di
- mov byte ptr ds:[di],cl;从后往前
- loop rea
-
-
- zero:
-
- ret
-
-
-
-
-
-
-
-
-
- divw:
- ;进行不会溢出的除法运算 16位除8位
- ;参数:ax被除数,cl除数
- ;返回:al结果的低8位,ah结果的高8位,cl余数
- ;如0973H除2
- ;ah al cl ch
- ;09 73 02 73
- ;00 09 02 73
- ;01 04 02 73
- ; dl
- ;01 73 02 73
- ;01 B9 02 73
- ;01 B9 01 73
- ;ex:
- ; mov ax,9473H
- ; mov cl,14H
- ; call divw
- mov ch,al ;暂时保存al的值
- mov al,ah
- mov ah,0
- div cl ;00dx /cx 0009/2
- mov dl,al ;保存低8位的结果
- mov al,ch;恢复al的值
- div cl ;173/2
- mov cl,ah
- mov ah,dl
- ret
-
-
-
-
-
-
-
-
-
-
-
-
- show_str: ;显示字符串
- ;参数:dl行0~24 dh列0~79 cl颜色 ds:[si]字符串的首地址
- ;应用示例:
- ; mov dl,12
- ; mov dh,40
- ; mov cl,01101101B
- ; mov ax,mydat
- ; mov ds,ax
- ; mov si,0
- ; call show_str
- mov bx,0B800H
- mov es,bx
-
- mov ax,0A0H
- mul dl
- mov bx,ax
- mov ax,02H
- mul dh
- add bx,ax
- mov dl,cl
- cir:
-
- mov ch,0
- mov cl,ds:[si]
- jcxz ou
- mov es:[bx],cl
- mov es:[bx+1],dl
- inc si
- add bx,2
- jmp short cir
- ou:
- ret
-
-
-
- divdw:
- ;进行不会溢出的除法运算,32位除16位
- ;参数:ax为低16位,dx为高16位,cx除数
- ;返回:ax结果的低16位,dx结果的高16位,cx余数
- ;如0973H除2
- ;dx ax cx bx
- ;09 73 02 73
- ;00 09 02 73
- ;01 04 02 73
- ;push ax
- ;01 73 02 73
- ;01 B9 02 73
- ;01 B9 01 73
- ;应用示例:
- ; mov ax,9473H
- ; mov dx,0187H
- ; mov cx,3142H
- ; call divdw
- mov bx,ax ;暂时保存ax的值
- mov ax,dx
- mov dx,0
- div cx ;00dx /cx 0009/2
- push ax ;保存低16位的结果
- mov ax,bx;恢复ax的值
- div cx ;173/2
- mov cx,dx
- pop dx
- ret
-
- myc ends;结束段
- end start;结束程序,同时告诉编译器,程序入口的标号是start
复制代码
|
|