龙龙 发表于 2015-6-22 03:12:22

汇编作业 实验10(3)

  
  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, ; 数据存到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 , bl    ; 转换好的数据存到字符串中
  inc si
  loop c2m
  mov byte ptr , 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    ; /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,
  jcxz exit   ; 结尾则退出
  mov es:, cl ; 存储字符的ASCII
  inc di
  mov es:, 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
页: [1]
查看完整版本: 汇编作业 实验10(3)