|
主题 : : 实验十 第三题 [待解决] |
回复[ 0次 ]
点击[ 323次 ] | |
荣誉值:0
信誉值:0
注册日期:2009-11-16 13:00 |
assume cs:codeseg
dataseg segment
db 64 dup(0)
dataseg ends
dataseg2 segment
dw 123,12666,1,8,3,38
dataseg2 ends
codeseg segment
start: mov ax,dataseg
mov ds,ax
mov di,0 ; 存储数据的地方
mov ax,dataseg2
mov es,ax
mov si,10 ;源数据
mov cx,6
; 取出源数据,进行取得各位数
getData:push cx
mov ax,0
mov dx,0
mov ax,es:[si]
sub si,2
call begin
pop cx
loop getData
; 显示数据
mov dh,8
mov dl,3
mov cl,2H
mov al,dl
mov ah,2
mul ah
mov bx,ax
mov al,0A0H
mul dh
add bx,ax ; 最终的偏移地址在AX中
mov ax,0B800h
mov es,ax ; 段地址
call show_str
;========================== 结束程序
mov ax,4c00h
int 21h
; dh =(0-24) dl=(0-79) cl=color ds:si 指向字符 , 注意dl 说的是第几列而不是第几个字符
show_str: ;执行相应的push ,以及可能有的初始化话操作,避免重复赋值
;====================
; 寄存器数据入栈
;=======================
sub di,2
display: mov cx,di
jcxz return
;开始进行存放字符
mov al,[di]
mov byte ptr es:[bx],al
inc bx
;开始存放属性
mov byte ptr es:[bx],42H
inc bx
sub di,1
jmp short display
return: ;取出地址为0的数据
mov al,[di]
mov byte ptr es:[bx],al
inc bx
;开始存放属性
mov byte ptr es:[bx],42H
ret
;========================================
; the init before the div
begin:
be: mov cx,10
call divdw
mov [di],cl
INC DI
mov cx,ax
add cx,dx
jcxz ok
jmp short be
ok: mov ax,2020H ; 放两个空格
MOV [di],ax
add di,2
ret
;======================================================
divdw: ; int(H/N)*10000h + (rem(H/N)*65536+l)/n H = dx L=AX N =CX
push ax
mov ax,dx
mov dx,0
div cx ;商放在 AX 余数在dx中
mov bx,ax; 存放 作为高位的 ax
;====
pop ax
div cx ;商放在 ax 余数放在 dx种
;==========
mov cx,dx ;余数最后放在了 cx种
add cx,30H
mov dx,bx
ret
;======================================================
codeseg ends
end start
搞了三天,终于搞出来了。
代码质量不行,但还是能运行。仅供参考。本人菜鸟也! | | |