王爽《汇编语言》第10章 实验10 编写子程序

本文通过具体的MASM代码示例,展示了如何使用MASM进行简单的显示操作、除法运算及数据转换等基本功能。介绍了show_str、divdw和dtoc三个实用子程序的实现细节。
花了三个多小时写出来的东西,真费劲。。。接下来就是本书的两个课程设计之一。
assume cs:code

data segment
  db 'Welcome to masm!',0
data ends

numberdata segment
  dw 123,12666,1,8,3,38
numberdata ends

code segment
start:
  ;测试显示函数
  mov dh,8
  mov dl,3
  mov cl,2
  mov ax,data
  mov ds,ax
  mov si,0
  call show_str
  
  ;测试除法
  mov ax,0FFFFH
  mov dx,0FFFFH
  mov cx,0FH
  call divdw
  
  ;测试数据转字符
  mov ax,data
  mov ds,ax
  mov si,0
  mov ax,numberdata
  mov es,ax
  mov ax,es:[0]
  call dtoc
  
  mov ax,4c00h
  int 21h

dtoc: ;功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符
      ;参数:(ax)=word型数据
      ;      ds:si指向字符串首地址 (‘0’:30H,‘9’:39H) 
      push bx
      push cx
      push si
        
      mov dx,0
    k:  
      mov cx,ax
      jcxz r
      mov cx,10     
      call divdw
      mov bx,30H
      add bx,cx
      mov ds:[si],bx
      inc si
      loop k
    r:
      pop si
      pop cx
      pop bx  
      ret
      
      
divdw: ;功能:进行不会产生溢出的除法运算,被除数为dword型
       ;      除数为word型,结果为dword型
       ;参数:(ax)=dword型数据的低16位
       ;      (dx)=dword型数据的高16位
       ;      (cx)=除数
       ;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
       push bx
       push dx
       push di
       push si
       ;先算00ax/cx商si余数di,再算00dx/cx商bx余数为dx,然后算dxdi/cx余数dx      
       mov bx,dx
       mov dx,0
       div cx
       mov di,dx;余数最大为cx-1
       mov si,ax;商最大为 0000 FFFF
       
       mov ax,bx
       mov dx,0
       div cx   ; bx00/cx
       mov bx,ax;商最大为 0000 FFFF
                ;余数dx最大为 cx-1
       
       mov ax,di
       div cx   ; dxdi/cx  
       add si,ax;商最大为 0000 FFFF, si不可能溢出
       
       mov cx,dx
       mov dx,bx
       mov ax,si
       
       pop si
       pop di
       pop dx
       pop bx
       ret
  

show_str: ;功能: 在指定的位置,用指定的颜色,
          ;       显示一个用0结束的字符串
          ;参数: (dh)=行号(0~24),(dl)=列号(0~79),
          ;       (cl)=颜色,ds:si字符串首地址
          ;返回:无
        push ax
        push bx
        push cx
        push dx
        push es
        push si
        
        ;确定输出第一个偏移位置bx
        mov ax,0B800H
        mov es,ax
        mov al,dh
        mov ah,160
        mul ah
        mov dh,0
        add ax,dx
        add ax,dx
        mov bx,ax
      
        mov ah,cl ;颜色保存在高位
        mov ch,0
        
      s:  
        mov cl,ds:[si]
        jcxz ok 
        mov al,cl
        mov es:[bx],ax
        add bx,2
        inc si
        jmp short s
      ok:
        pop si
        pop es
        pop dx
        pop cx
        pop bx
        pop ax
        ret
  
code ends
end start

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值