龙龙 发表于 2015-6-22 03:11:37

汇编作业 课程设计

  
  assume cs:codesg, ds:data, es:data2
  data segment
  db 32 dup(20H)
  data ends
  data2 segment
  ; 年份
  db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982'
  db '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990'
  db '1991', '1992', '1993', '1994', '1995'
  ; 收入
  dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479
  dd 140417,197514, 345980, 590827, 803530, 1183000, 1843000
  dd 2759000, 3753000, 4649000, 5937000
  ; 雇员数
  dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793
  dw 4037, 5635, 8226, 11542, 14430, 15257, 17800
  data2 ends
  codesg segment
  start:
  mov ax, data
  mov ds, ax
  mov ax, data2
  mov es, ax
  mov cx, 21
  mov bp, 0   ; 年份的首地址
  mov bx, 54H ; 收入的首地址
  mov di, 0a8H; 雇员数的首地址
  mov dh, 4   ; 从第4行开始逐行显示表格
  mov dl, 0   ; 从第0列显示每行信息
  s:
  push cx
  push dx
  mov si, 0   ; 字符串的首地址
  ; 复制年份
  mov ax, es:
  mov , ax
  mov ax, es:2
  mov 2, ax
  add si, 9   ; 9列显示年份
  ; 复制收入
  mov ax, es:
  ; 收入的低16位
  mov dx, es:2
  ; 收入的高16位
  call dtoc
  add si, 9    ; 9列显示收入
  ; 复制雇员数
  mov ax, es:
  mov dx, 0
  call dtoc
  add si, 9    ; 9列显示雇员数
  ; 复制人均收入
  mov ax, es:
  ; 收入的低16位
  mov dx, es:2
  ; 收入的高16位
  div word ptr es:
  mov dx, 0
  call dtoc
  mov byte ptr 3, 0 ; 字符串结束标志设为0
  pop dx
  mov cl, 2   ; 字符显示为绿色
  call show_str
  inc dh      ; 行数+1
  add bp, 4   ; 下一个年份
  add bx, 4   ; 下一个收入
  add di, 2   ; 下一个雇员数
  pop cx
  loop s
  mov ax, 4c00H
  int 21H
  ; 子程序dtoc
  dtoc:
  push bx
  push cx
  push si
  mov bx, 0
  s00:
  mov cx, ax
  jcxz ok
  mov cx, 10
  call divdw
  add cx, 30H   ; 余数转换为ASCII
  push cx   ; 余数入栈
  inc bx    ; 数字位数+1
  jmp short s00
  ok:
  mov cx, bx
  c2m:
  pop bx
  mov , bl
  inc si
  loop c2m
  pop si
  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
  mov bp, ax    ; 将第n行的首地址存在bp
  mov ax, 2
  mul dl
  mov di, ax    ; 将第n列存在di
  mov si, 0
  ctom:
  mov ch, 0
  mov cl,
  jcxz exit
  mov es:, cl
  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
  codesg ends
  end start
一个也看不懂!!
页: [1]
查看完整版本: 汇编作业 课程设计