找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1701|回复: 0

汇编作业 实验10(3)

[复制链接]
  • TA的每日心情
    开心
    2018-10-31 14:26
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    78

    主题

    109

    回帖

    1019

    积分

    高级会员

    积分
    1019

    猴年

    龙龙实名认证 发表于 2015-6-22 03:12:22 | 显示全部楼层 |阅读模式
      
      assume cs:code, ds:data
      data segment
      db 10 dup(0)
      dw 123, 12666, 1, 8, 3, 38
      data ends
      code segment
      start:
      mov ax, data
      mov ds, ax
      mov si, 0  ; 字符串的首地址
      mov bx, 0aH; 待转换数据的首地址
      mov di, 0  ; 待转换数据的相对bx偏移地址
      mov cx, 6  ; 6个待显示数据
      mov dh, 4  ; 从第4行开始逐行显示数据
      mov dl, 0  ; 从第0列开始显示每行数据
      trans:
      push cx
      push dx
      mov dx, 0   ; 高16位设为0存到dx
      mov ax, [bx][di]; 数据存到ax,当作低16位
      call dtoc   ; 数据转化为ASCII的10进制
      mov cl, 2   ; 字体显示为绿色
      pop dx
      call show_str ; 显示数据的ASCII
      add di, 2   ; 下一个数据
      inc dh    ; 行数+1
      pop cx
      loop trans
      mov ax, 4c00H
      int 21H
      ; 子程序dtoc
      dtoc:
      push bx
      push cx
      push dx
      push si
      mov bx, 0   ; 记录数字位数
      s0:
      mov cx, ax  ; 判断ax是否为0
      jcxz ok   ; 为0则结束转换
      mov cx, 10  ; 除数为10
      call divdw  ; 防溢出的除法
      add cx, 30H   ; 余数转换为ASCII
      push cx   ; 余数入栈
      inc bx    ; 数字位数+1
      jmp short s0
      ok:
      mov cx, bx
      c2m:
      pop bx
      mov [si], bl    ; 转换好的数据存到字符串中
      inc si
      loop c2m
      mov byte ptr [si], 0  ; 字符串结束标志为0
      pop si
      pop dx
      pop cx
      pop bx
      ret
      ; 子程序divdw
      divdw:
      push bx
      mov bx, ax  ; 低16位L暂时存在bx
      mov ax, dx  ; 高16位H送到ax
      mov dx, 0
      div cx    ; H/N
      push ax   ; int(H/N)入栈
      mov ax, bx
      div cx    ; [rem(H/N)*65536+L]/N
      mov cx, dx  ; 余数送到cx
      pop dx    ; int(H/N)出栈
      pop bx
      ret
      ; 子程序show_str
      show_str:
      push ax
      push bx
      push bp
      push cx
      push si
      push di
      push es
      mov bl, cl    ; 字体颜色存在bl中
      mov ax, 0b800H
      mov es, ax    ; 显示缓冲区的段地址存在es
      mov ax, 0a0H
      mul dh      ; 计算第n行的首地址
      mov bp, ax    ; 将第n行的首地址存在bp
      mov ax, 2
      mul dl      ; 计算第m列的偏移地址
      mov di, ax    ; 将第n列存在di
      ctom:
      mov ch, 0     ; 判断字符串是否到了结尾
      mov cl, [si]
      jcxz exit     ; 结尾则退出
      mov es:[bp][di], cl ; 存储字符的ASCII
      inc di
      mov es:[bp][di], bl ; 存储字符的属性
      inc si
      inc di
      jmp short ctom
      exit:
      pop es
      pop di
      pop si
      pop cx
      pop bp
      pop bx
      pop ax
      ret
      code ends
      end start

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|虫虫联盟 ( 备案号:蜀ICP备15018121号-1 )

    GMT+8, 2024-11-23 16:05 , Processed in 0.334069 second(s), 26 queries .

    Powered by Discuz! X3.5 Licensed

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表