汇编语言(王爽)--实验10编写子程序

assume cs:code,ds:data
data segment
    db 'welcome to masm!',0
data ends

code segment
 
start: mov dh,8
       mov dl,1
       mov cl,2
       mov ax,data
       mov ds,ax
       mov si,0
       call show_str
       
       mov ax,4c00h
       int 21h
;显示字符串函数  dh为行号dl为列号cl为颜色       
show_str:mov bl,cl
         push cx  
         push si
         
         mov ax,0B800H
         mov es,ax                 ;显存段地址进es
         
         mov al,160          ;行号和列号的偏移地址准备就绪
         mul dh
         mov di,ax
         mov al,2
         mul dl
         add di,ax                   
         
       s:mov cl,ds:[si]
         mov ch,0
         jcxz ok          ;到字符串末尾0跳到ok
         mov es:[di],cl
         mov es:[di+1],bl
         add di,2
         inc si
         jmp s
         
      ok:pop si
         pop cx
         ret

code ends

end start

assume cs:code,ss:stack

stack segment
    dw 16 dup(0)
stack ends

code segment

    start:mov ax,0ffffh    ;低16位
          mov dx,0fffh    ;高16位
          mov cx,0ah      ;除数
          call divdw
       
          mov ax,4c00h
          int 21h
       ;32位除法        结果:dx放搞16位,ax放低16位  cx放商
    divdw:mov bx,ax     ;低16位暂存
          
          mov ax,dx     
          mov dx,0       ;dx    ax
          div cx         ;0     被除数高16位
          push ax       ;商push 
                   
                         ;(rem(H/N)*65536+L)   /N
                         ;   上一步的余 低16位  除数
          mov ax,bx      ;     DX       bx->ax    cx      
          div cx
          ;事情做完
          mov cx,dx                 ;DX余,ax商  
          pop bx
          mov dx,bx
          ret
code ends

end start




assume cs:code,ds:data,ss:stack

data segment
    db 16 dup(0)
data ends

stack segment
    db 16 dup(0)
stack ends

code segment
    start:mov ax,34694
          mov bx,data
          mov ds,bx
          mov si,0
          call dtoc
                   
          mov dh,8
          mov dl,3
          mov cl,2
          call show_str
          
          mov ax,4c00h
          int 21h
    ;将word型数据转变位表示十进制数的字符串,字符串以0为结尾符        
    ;参数ax,写入ds:[si]
    dtoc:push si
         mov di,0           
  dtocs1:mov bx,10    ;16位除法
         mov dx,0
         div bx
         
         add dx,30h ;数字是倒叙的,所以要利用栈后进先出的特性改顺序
         push dx
         inc di
         mov cx,ax
         
         jcxz dtocs2
         jmp dtocs1
                                         ;正序
  dtocs2:mov cx,di
  dtocs3:pop ds:[si]    
         inc si
         loop dtocs3
         
         mov ds:[si],0  ;0结尾
         pop si
         ret 
    ;;显示字符串函数  dh为行号dl为列号cl为颜色  
show_str:mov bl,cl
         push cx  
         push si
         
         mov ax,0B800H
         mov es,ax                 ;显存段地址进es
         
         mov al,160          ;行号和列号的偏移地址准备就绪
         mul dh
         mov di,ax
         mov al,2
         mul dl
         add di,ax                   
         
   shows1:mov cl,ds:[si]
         mov ch,0
         jcxz showok          ;到字符串末尾0跳到ok
         mov es:[di],cl
         mov es:[di+1],bl
         add di,2
         inc si
         jmp shows1
         
   showok:pop si
         pop cx
         ret
code ends

end start


猜你喜欢

转载自blog.csdn.net/weixin_41256413/article/details/79806008