数值显示(在第8行第3列显示数字12666)

assume cs:code,ds:data

data segment
  db 10 dup (0)
data ends

code segment

start:	mov ax,12666
    mov bx,data
    mov ds,bx
    mov si,0
    call dtoc


    mov dh,8
    mov dl,3
    mov cl,0cah
    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  ;将ax/10d
    mov cx,ax  ;商,dx存储余数
    jcxz s2  ;当商为0,是则跳转s2
    add  dx,30h  ;当商不为0,则继续进行,加30h
    push dx  ;入栈
    inc bx  ;递增bx(bx)记录位数
    jmp short s1  ;循环s1

  s2:	add dx,30h  ;将余数加30h
    push dx  ;入栈
    inc bx  ;递增bx
    mov cx,bx  ;将位数传给cx,用于s3循环
    mov si,0  ;重置si,并继续向下执行

  s3:	pop ax  ;将ax出栈
    mov [si],al  ;把al的值传入data段
    inc si
    loop s3
        ;循环结束后向下执行okay段代码
  okay:
    pop bx  ;出栈
    pop si
    pop ax
    pop cx
    pop dx
    ret  ;回到13行

  show_str:
    push bx
    push cx
    push si
    mov al,0a0h  ;DOS屏幕上一行80字符,在显存中占用160字节
    dec dh  ;dh-1(dh=8) 行号1-25,变成0-24
    mul dh  ;把al做乘数,把结果放在ax(乘以行号7)
    mov bx,ax  ;bx=ax
    mov al,2  ;每个字符在显存中占用2个字节
    mul dl  ;ax=dl*2(dl=3)(乘以列号3)
    sub ax,2  ;ax-=2(表示第三列)
    add bx,ax  ;bx+=ax(得到第一个字符在显存中的地址)
    mov ax,0b800h
    mov es,ax  ;显存段地址
    mov di,0
    mov al,cl ;ax=0cah(显示属性)
    mov ch,0

  s:	mov cl,ds:[si]  ;先放入cl
    jcxz ok  ;检测是否为0,是则返回(为0及已经到达结尾)
    mov es:[bx+di],cl  ;将数值放入显存
    mov es:[bx+di+1],al  ;放入属性
    inc si
    add di,2  ;显存中的偏移值
    jmp short s

  ok:	pop si
    pop cx
    pop bx
    ret  ;返回

code ends

end start

 

说点什么

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒