鱼C论坛

 找回密码
 立即注册
查看: 3322|回复: 1

[汇编作业] 汇编语言-程序设计1-显示power idea公司的数据

[复制链接]
发表于 2016-8-3 19:18:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
哎呀,调试发现了大概不到10出错误,终于成功
  1. assume cs:code

  2. data segment
  3.         ;首先:将原始数据写入内存
  4.         db '1975','1976','1977','1978','1979','1980','1981','1982'
  5.         db '1983','1984','1985','1986','1987','1988','1989','1990'
  6.         db '1991','1992','1993','1994','1995'
  7.         ;--------21个年份字符串

  8.         dd 16,22,382,1356,2390,8000,16000,24486
  9.         dd 50065,97479,140417,197514,345980,590287,803530,1183000
  10.         dd 1843000,2759000,3753000,4649000,5937000
  11.         ;--------21个公司总收入

  12.         dw 3,7,9,13,28,38,130,220
  13.         dw 476,778,1001,1442,2258,2793,4037,5635
  14.         dw 8226,11542,14430,15257,17800
  15.         ;--------21个公司雇员人数
  16. data ends

  17. table segment
  18.         ;其次:定义整体内存空间,最终将所有结果转写入此段
  19.         db 21 dup ('year summ ne ?? ')                ;每条为1年的信息
  20. table ends

  21. ascii segment
  22. db 840 dup (' ')
  23. db 8 dup (0)
  24. ascii ends

  25. stack segment
  26. dw 16 dup(0)                        ;32B
  27. stack ends

  28. code segment
  29. start:
  30.         mov ax,stack
  31.         mov ss,ax
  32.         mov sp,32
  33.        
  34.         mov ax,data
  35.         mov ds,ax
  36.        
  37.         mov ax,table
  38.         mov es,ax
  39.        
  40.         mov bx,0
  41.         mov si,0
  42.         mov di,0

  43.         ;将内存中的数据及计算出的数据写入table段中       
  44.         mov cx,21       
  45. totable:
  46.         push cx                        ;非常重要

  47.         mov ax,ds:[bx]
  48.         mov es:[di],ax
  49.         mov ax,ds:[bx+2]
  50.         mov es:[di+2],ax

  51.         mov ax,ds:[84+bx]
  52.         mov es:[di+5],ax
  53.         mov ax,ds:[84+bx+2]
  54.         mov es:[di+5+2],ax

  55.         mov ax,ds:[168+si]
  56.         mov es:[di+0ah],ax
  57.        
  58.         mov dx,es:[di+5+2]
  59.         mov ax,es:[di+5]
  60.         mov cx,es:[di+0ah]
  61.         call divdw
  62.         mov es:[di+0dh],ax        ;此处丢弃了dx(商的高位),只取了ax,因原table中直给出了2B空间存储人均收入

  63.         add bx,4
  64.         add si,2
  65.         add di,16
  66.         pop cx
  67.         loop totable                ;存储完毕跳转
  68.        
  69.         ;将table段中数据转换为ASCII码,存入ascii段中
  70.         ;存储方式:年份10B_[0]开始,收入10B_[10]开始,雇员数10B_[20]开始,人均收入10B_[30]开始
  71.         ;占用空间40*21=840B,无数据处为空格

  72.         mov ax,table
  73.         mov ds,ax
  74.        
  75.         mov ax,ascii
  76.         mov es,ax

  77.         mov si,0
  78.         mov di,0

  79.         mov cx,21
  80. toascii:
  81.         push cx

  82.         ;年份传递------->>>>>>>>
  83.         mov ax,ds:[si]                       
  84.         mov es:[di],ax
  85.         mov ax,ds:[si+2]
  86.         mov es:[di+2],ax       
  87.        
  88.         ;收入传递------->>>>>>>>
  89.         mov dx,ds:[si+7]
  90.         mov ax,ds:[si+5]

  91.         mov bx,0                ;计算余数cx的推入次数
  92. dtocloop_sr:
  93.         mov cx,10
  94.         call divdw                ;返回值:dx给出商的的高位,ax给出商的低位,cx余数
  95.         push cx
  96.         inc bx
  97.         mov cx,dx
  98.         add cx,ax
  99.         jcxz xr_ok
  100.         jmp short dtocloop_sr

  101. xr_ok:        mov cx,bx
  102.         mov bp,0
  103. qz_sr:
  104.         pop ax
  105.         add ax,30h
  106.         mov byte ptr es:[di+10+bp],al
  107.         inc bp
  108.         loop qz_sr

  109.         ;雇员数传递------->>>>>>>>
  110.         mov dx,0
  111.         mov ax,ds:[si+0ah]

  112.         mov bx,0                ;计算余数cx的推入次数
  113. dtocloop_gys:       
  114.         mov cx,10
  115.         call divdw                ;返回值:dx给出商的的高位,ax给出商的低位,cx余数
  116.         push cx
  117.         inc bx
  118.         mov cx,dx
  119.         add cx,ax
  120.         jcxz gys_ok
  121.         jmp dtocloop_gys       

  122. gys_ok:        mov cx,bx
  123.         mov bp,0
  124. qz_gys:
  125.         pop ax
  126.         add ax,30h
  127.         mov byte ptr es:[di+20+bp],al
  128.         inc bp
  129.         loop qz_gys

  130.         ;人均收入传递-------->>>>>>>>
  131.         mov dx,0
  132.         mov ax,ds:[si+0dh]

  133.         mov bx,0                ;计算余数cx的推入次数
  134. dtocloop_rjsr:       
  135.         mov cx,10
  136.         call divdw                ;返回值:dx给出商的的高位,ax给出商的低位,cx余数
  137.         push cx
  138.         inc bx
  139.         mov cx,dx
  140.         add cx,ax
  141.         jcxz rjsr_ok
  142.         jmp short dtocloop_rjsr       

  143. rjsr_ok:       
  144.         mov cx,bx
  145.         mov bp,0
  146. qz_rjsr:
  147.         pop ax
  148.         add ax,30h
  149.         mov byte ptr es:[di+30+bp],al
  150.         inc bp
  151.         loop qz_rjsr

  152.         mov ax,0
  153.         mov es:[di+30+8],ax        ;最后两字节设置00为断点
  154.        
  155.         add si,16
  156.         add di,40
  157.        
  158.         pop cx                        ;此处无法使用loop,借用跳转命令
  159.         dec cx
  160.         jcxz toascii_ok
  161.         jmp near ptr toascii       





  162.         ;调用“显示”子程序,给定初始化值

  163. toascii_ok:
  164.         mov dh,3                ;给定显示的位置及颜色要求:8行3列、绿色
  165.         mov dl,3
  166.         mov cl,2

  167.         mov ax,ascii
  168.         mov ds,ax
  169.         mov bx,0

  170.         mov cx,21
  171. show21:        push cx
  172.         mov cl,2
  173.         call show_str
  174.         add bx,40
  175.         inc dh
  176.         pop cx
  177.         loop show21

  178.         mov ax,4c00h
  179.         int 21h

  180. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  181. show_str:
  182.         ;参数:行=dh,列=dl,颜色值=cl,bx为设置循环使用
  183.         ;返回值:将内存中的ASCII码内容显示出来

  184.         ;此子程序要求给定值在相应的寄存器中:行=dh,列=dl,颜色值=cl
  185.         ;此程序要求栈段的长度为32B

  186.         ;要调用此子程序,须ASCII码内容在ds段中
  187.         ;遇到字节00,停止显示

  188.         push ds
  189.         push es
  190.         push si
  191.         push di
  192.         push ax
  193.         push bx
  194.         push cx
  195.         push dx
  196.        
  197.         ;求目标地址
  198.         mov ax,0b800h
  199.         mov es,ax
  200.         mov si,0
  201.         mov di,0
  202.        
  203.         mov ax,0
  204.         mov al,160
  205.         dec dh                        ;从0行开始计数
  206.         add dh,2                ;显存从第3行开始显示
  207.         mul dh
  208.         add di,ax

  209.         mov ax,0
  210.         mov al,2                ;每个要显示的字符占用2B
  211.         dec dl                        ;列值-1,第一列转变为第0列
  212.         mul dl                       
  213.         add di,ax                ;求得显示的起始位置di

  214.         mov ah,cl                ;颜色值入ah
  215.         mov cx,0                ;清空cx的值

  216.         ;向目标地址写入数据       
  217. show_str_s:       
  218.         mov cl,ds:[bx+si]                ;判断0,退出显示
  219.         jcxz show_str_ok
  220.         mov al,ds:[bx+si]
  221.         mov es:[di],al
  222.         mov es:[di+1],ah
  223.         inc si
  224.         add di,2
  225.         jmp show_str_s

  226. show_str_ok:       
  227.         pop dx
  228.         pop cx
  229.         pop bx
  230.         pop ax
  231.         pop di
  232.         pop si
  233.         pop es
  234.         pop ds
  235.         ret       

  236. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  237. divdw:
  238.         ;此子程序的作用为防止被除数位32位时,商的溢出

  239.         ;参数:dx给出32位被除数的高位,ax给出32位被除数的低位,cx除数
  240.         ;返回值:dx给出商的的高位,ax给出商的低位,cx余数
  241.        
  242.         push si

  243.         mov si,ax
  244.         mov ax,dx
  245.         mov dx,0       
  246.         div cx
  247.         push ax
  248.         mov ax,si
  249.         div cx
  250.         mov cx,dx
  251.         pop dx
  252.        
  253.         pop si
  254.         ret
  255.        

  256. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  257. dtoc:
  258.         ;参数:ax给出被除数
  259.         ;返回值:转换结果存在ds:[si]中,逆序存放

  260.         ;此子程序要求给定16位被除数在寄存器ax中,除数为8位=10
  261.         ;此程序要求栈段的长度为32B

  262.         push ax
  263.         push bx
  264.         push cx
  265.         push dx
  266.         push si
  267.        
  268.         mov dx,10                ;设定除数
  269.         mov bx,ax
  270. dtoc_2bdiv1b_s:
  271.         mov ah,0
  272.         mov al,bh
  273.         div dl
  274.         mov ch,al
  275.         mov al,bl
  276.         div dl
  277.         mov cl,al

  278.         add ah,30h
  279.         mov ds:[si],ah                ;余数写入内存ds:[si]中
  280.         jcxz dtoc_2bdiv1b_ok
  281.         inc si
  282.         mov bx,cx
  283.         jmp dtoc_2bdiv1b_s
  284.        
  285.        
  286. dtoc_2bdiv1b_ok:
  287.         pop si
  288.         pop dx
  289.         pop cx
  290.         pop bx
  291.         pop ax
  292.         ret       
  293. code ends
  294. end start
复制代码
2.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-3 19:21:45 | 显示全部楼层
错误:
1、再次忘记数字+30h转换为ascii码
2、loop与cx处,依然出现循环次数与子程序中的cx使用冲突忘记解决
3、...先到这吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-2 15:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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