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

本文通过具体的MASM代码示例,展示了如何使用MASM进行简单的显示操作、除法运算及数据转换等基本功能。介绍了show_str、divdw和dtoc三个实用子程序的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

花了三个多小时写出来的东西,真费劲。。。接下来就是本书的两个课程设计之一。
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值