美文网首页
汇编语言(第三版)-- 实验10

汇编语言(第三版)-- 实验10

作者: Cichar | 来源:发表于2017-03-20 17:14 被阅读0次
    子程序代码:
    stack segment
      db 8 dup (0)
    stack ends
    
    show_str: push cx
              push bx
              push si
              push di
              push es
    
              mov ax,0b800h
              mov es,ax
              
              mov al,0a0h                # 一行160字节
              dec dh                     # 如果需要在第n行开始显示,则前面的n-1行全部计入偏移量
              mul dh                     # al * dh,计算行偏离
              mov bx,ax                  # 将偏离量传入bx
                                         # 以上四句计算行偏移
    
              mov al,2                   # 每一列2字节
              mul dl                     # al * dl,计算列偏移
              dec ax,2                   # 在第n列开始显示,则前面n-1列全部计入偏移量
              add bx,ax                  # 在第n行第m列显示,需要偏移:(n-1的行偏移) + (m-1的列偏移)
                                         # 以上四句,前三句计算列偏移,第四句计算总偏移
    
              mov di,0
              mov al,cl                  # 颜色传入al
              mov ch,0                   # ch传0
    
           s: mov cl,ds:[si]             # 字符传入cl,因cl已经传入al,不必担心颜色数据被覆盖
              jxcz ok                    # 判断是否已经到了字符的0字节尾部
              mov es:[bx + di],cl        # 字符传入
              mov es:[bx + di + 1],al    # 颜色传入
                                         # 以上四句在需要显示的n行m列进行字符串及颜色处理
    
              inc si                     # 字符串偏移自增
              add di,2                   # 处理字符串的偏移
              jmp short s                # 因没有利用loop,故用 jmp short 标号 进行转移
    
          ok: pop es
              pop di
              pop si
              pop bx
              pop cx
    
              ret
              
    
    子程序代码:
    stack segment
      db 8 dup (0)
    stack ends
    
    divdw: push ax              # 被除数低位压栈
           
           mov ax,dx            # 将被除数高位传入ax
           mov dx,0
    
           div cx               # ax/cx,公式中的H/N
           mov bx,ax            # 描述性运算符int()处理
                                # 以上两句处理了公式int(H/N)部分
    
           pop ax               # 被除数低位出栈,此时dx中为rem(H/N),正好满足公式中[rem(H/N)*65536 + L]
    
           div cx               # (dx*16 + ax)/cx,公式中的[rem(H/N)*65536 + L]/N
    
           mov cx,dx            # 余数传给cx
           mov dx,bx            # 将之前的int(H/N)部分传给dx
    
           ret
    
    子程序代码:
    dtoc: push ax
          push si
          push di
          push cx
          push dx
          mov di,0
    
      s0: mov cx,10d       # 将10传入cx
          mov dx,0
          div cx
    
          mov cx,ax        # 商为0,则证明完成了求值
          jxcz s1
    
          add dx,30h       # 将余数转换为ACSII
          push dx          # 转换完成的数据压栈
          inc di
          jmp short s0
    
      s1: add dx,30h       # 记录最后一个余数,并转化ACSII
          push dx
          inc di
    
          mov cx,di        # 将记录的数据位数传入cx,作为s2的循环次数
    
      s2: pop ax           # 将转换完的字符 出栈
          mov ds:[si],al   # ACSII 只占用了低8位,配合show_str中的: mov cl,ds:[si]  
          inc si
          loop s2
    
          pop dx
          pop cx
          pop di
          pop si
          pop ax
    
          ret
    
    show_str:在第一小节中已给出
    
    

    相关文章

      网友评论

          本文标题:汇编语言(第三版)-- 实验10

          本文链接:https://www.haomeiwen.com/subject/cffinttx.html