|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
因为我觉得题意是说把data段中的数据都显示出来
assume cs:code,ds:data,ss:stack
data segment
dw 123,12666,1,8,3,38
dw 10 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,10h
mov si,0
mov bp,0
mov cx,6
s: mov ax,ds:[si]
call dtoc
add si,2
loop s
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc: push dx
push cx
push ax
push si
push bx
mov bx,0 ;计算一共添加了多少个字节
s1: mov cx,10d
mov dx,0
div cx
mov cx,ax ;把商ax赋值给cx,判断是否为0
jcxz s2
add dx,30h
push dx
inc bx
jmp short s1
s2: add dx,30h ;因为商ax等于0,有余数dx没添加
push dx
inc bx
mov cx,bx ;确定本次循环次数
mov si,0
s3: pop ax
mov ds:[bp+si+10h],al ;把转换过的数据添加到ds中
inc si
loop s3
add bp,bx ;bp保存一共用掉的字节
okay: pop bx
pop si
pop ax
pop cx
pop dx
ret
show_str: push si
push cx ;保存颜色数据备用
mov al,0ah ;160就是A0h,因为是偏移地址,所以取十位为0Ah
dec dh
mul dh ;8位乘法 al * dh = ax
add ax,0b800h ;算出段地址
mov es,ax
mov al,2
dec dl
mul dl ;8位乘法 al * dl = ax
mov di,ax ;算出偏移地址,赋值给显示初始位置di
mov si,0
s0: mov cl,byte ptr [si+10h] ;根据你自己设计的储存地址改变
mov ch,0
jcxz ok ;判断内存中是否遇到0
mov al,ds:[si+10h] ;根据你自己设计的储存地址改变
mov es:[di],al ;将data段中的数据copy到显存es中
pop ax ;取出保存的颜色值
mov es:[di+1],al ;将颜色值数据copy到显存es中
push ax ;再次保存颜色值,备用
inc si
add di,2
jmp short s0
ok: pop cx
pop si
ret ;退出
code ends
end start |
|