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