鱼C论坛

 找回密码
 立即注册
查看: 2350|回复: 4

[汇编作业] 第十章课程设计1____源码————————

[复制链接]
发表于 2014-5-24 19:20:54 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 decoder 于 2014-5-24 19:55 编辑
  1. assume cs:code
  2. data segment
  3.           db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  4.         db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  5.         db '1993','1994','1995'
  6.         dd 16,22,382,1356,2390,8000,16000,24486,50065,97478,140417,197514
  7.         dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  8.         dw 3,7,9,13,28,38,130,220,476,778,1001,1422,2258,2793,4037,5635,8226
  9.         dw 11542,14430,15257,17800
  10. data ends

  11. buff_mem segment   
  12.    db 1280 dup(0)   ;48个字节储存一行数据,共使用1008个字节为了内存对齐申请1280字节内存空间  
  13. buff_mem ends
  14. ;es:[3f0]  21年循环变量 3f0h  3f0h
  15. ;es:[3202]  年数据最低位 3f2h  3f2h
  16. ;es:[3203]  年数据次低位 3f3h  3f3h
  17. ;es:[3204]  年数据次高位 3f4h  3f4h
  18. ;es:[3205]  年数据最高位 3f5h  3f5h
  19. ;es:[3206]  除数         3f6h 3f6h
  20. ;es:[3208]  四位十六进制数除法的低位商       3f8h 3f8h
  21. ;es:[3210]  四位十六进制除法的   余数 3fah 3fah
  22. ;es:[3212]   ds:[bx]中bx的值         3fch 3fch
  23. ;es:[3214]  保存bp的值    3f8h  3feh
  24. ;es:[3216]  保存di的值          0400h
  25. ;ds:[0402]  保存字符处理循环中的临时cx变量
  26. ;ds:[0404]  保存显示函数中的di
  27. code segment
  28.      start:              call get_data
  29.                            call process_data   ;0014
  30.                            call display_data
  31.                            mov ax,4c00h
  32.                            int 21h
  33.         
  34.     get_data:       mov ax,data
  35.                           mov ds,ax
  36.         ret
  37.      process_data:                                    ;ip=0014
  38.                            ;初始化
  39.                          mov ax,buff_mem ;es指向buff_mem  es=0b5e
  40.                          mov es,ax
  41.                          mov bx,0
  42.                          mov si,84           ;数据偏移到收入地址
  43.                          mov bp,0
  44.                          mov di,48            ;行递增数据,初始化为距左边4字节
  45.                          mov cx,21
  46.                                                 
  47.      _loop_21_:   push cx        ;保存21年的循环
  48.                           mov es:[0400h],di        ;保存21年循环中di的当前值
  49.                           mov es:[3feh],bp
  50.                           call covent_year        ;年份       ip=0086
  51.                           call covent_summ        ;资产       ip=00a3
  52.                           call covent_ne          ;人数       ip=00e0
  53.                           call covent_pcdi        ;人均收入
  54.                           pop cx
  55.                           dec cx
  56.                           jcxz _l_21_out
  57.                           add bp,4
  58.                           add di,2ch
  59.                           add word ptr es:[3fch],4        ;bx镜像递增
  60.                           mov bx,es:[3fch]
  61.                            jmp _loop_21_
  62.         _l_21_out:  ret        
  63.                                                 
  64.         display_data:      
  65.                           mov ax,0b80ah
  66.                           mov es,ax
  67.                           mov ax,buff_mem
  68.                           mov ds,ax
  69.                           mov bx,0
  70.                           mov si,0
  71.                           mov bp,0
  72.                           mov di,20h
  73.                           mov cx,21
  74.                                                 
  75.                        b:push cx
  76.                           push di            ;用来定位要显示字符的位置
  77.                           push bx            ;用来定位要载入字符的位置
  78.                           mov ds:[404h],di   ;定位年列的位置
  79.                           mov cx,4
  80.           get_year: push cx            ;年份字符串的循环处理
  81.                           mov cx,ds:[bx]    ;取得年份字符的
  82.                           mov es:[di],cx
  83.                           pop cx
  84.                           add bx,2
  85.                           add di,2
  86.                           loop get_year
  87.                           add di,16
  88.                           mov cx,8
  89.                           mov ax,0
  90.                           add word ptr ds:[404h],16   ;定位资产列的位置
  91.                           mov di,ds:[404h]
  92. _get_summ:     push cx            ;资产字符串的循环处理
  93.                           mov cx,ds:[bx]
  94.                           jcxz _summ_eq0     ;判断字符是否为空,在48字节的段中去掉空格存入显存
  95.                           mov es:[di],cx
  96.                           add di,2
  97. _summ_eq0:    add ax,2
  98.                          add bx,2
  99.                          pop cx
  100.                          loop _get_summ
  101.                          add di,16
  102.                          mov cx,8
  103.                          sub di,ax
  104.                          add di,16
  105.                          add word ptr ds:[404h],20  ;定位人员列的位置
  106.                          mov di,ds:[404h]
  107. get_ne:            push cx
  108.                          mov cx,ds:[bx]             ;取得人员的字符
  109.                          jcxz _cx_ne_eq_0  ;判断字符是否为空,在48字节的段中去掉空格存入显存
  110.                          mov es:[di],cx
  111.                          add di,2
  112. _cx_ne_eq_0: add ax,2
  113.                          add bx,2
  114.                          pop cx
  115.                          loop get_ne
  116.                          add di,16
  117.                          mov cx,4
  118.                          sub di,ax
  119.                          add di,32
  120.                          add word ptr ds:[404h],16  ;定位人均收入列的位置
  121.                          mov di,ds:[404h]
  122.   get_sr:            push cx
  123.                          mov cx,ds:[bx]             ;取得人均收入位置的字符
  124.                          jcxz _cx_sr_eq_0    ;判断字符是否为空,在48字节的段中去掉空格存入显存
  125.                          mov es:[di],cx
  126.                          add di,2
  127. _cx_sr_eq_0:  add ax,2
  128.                          add bx,2
  129.                          pop cx
  130.                          loop get_sr
  131.                          add di,16
  132.                          pop bx
  133.                          pop di
  134.                          add di,0a0h
  135.                          add bx,48
  136.                          pop cx
  137.                          dec cx
  138.                          jcxz dp_out
  139.                          jmp b            ;此处原本用loop循环,但循环溢出,只能使用jmp段内转移
  140. dp_out:             ret


  141. covent_year:    push bx                      ;ip=0086   年份字符串处理
  142.                          push si
  143.                          push bp
  144.                          push di
  145.                          mov cx,4
  146.                                                 
  147. _loop_str:        mov al,byte ptr ds:[bx];年的单位字节数据
  148.                         mov byte ptr es:[bp+di-48],al
  149.                         mov byte ptr es:[bp+di-47],07h
  150.                         inc bx
  151.                         add bp,2
  152.                         loop    _loop_str
  153.                        pop di
  154.                        pop bp
  155.                        pop si
  156.                        pop bx
  157.     ret
  158.         
  159. covent_summ: push bx                     ;ip=00a3  资产字符串处理
  160.                        push si
  161.                        push bp
  162.                        push di
  163.                        mov ax,word ptr ds:[bx+si]
  164.                        mov dx,word ptr ds:[bx+si+2]
  165.                        mov word ptr es:[3f6h],10
  166. _div_loop:       call divdw                    ;cx为余数,ax为商
  167.                        mov word ptr es:[3fah],cx   ;余数用来做显示位
  168.                        add word ptr es:[3fah],30h  ;转换成字符
  169.                        mov ax,word ptr es:[3fah]   ;字符放入ax
  170.                        mov ah,07h                   ;把ah变成颜色位
  171.                        mov word ptr es:[bp+di-26],ax   ;保存入显示缓冲中
  172.                        mov ax,word ptr es:[3f8h]    ;低位商
  173.                        mov cx,ax
  174.                        jcxz _div_out                ;只要低位商为零就跳出
  175.                        sub bp,2                     ;从后往前放资产值
  176.                        jmp _div_loop
  177. _div_out:        pop di
  178.                        pop bp
  179.                        pop si
  180.                        pop bx
  181.             ret
  182.         
  183. covent_ne:    push bx                     ;ip=00e0   人员字符串处理
  184.                       push si
  185.                       push bp
  186.                       push di
  187.                       push word ptr es:[3fch]
  188.                                                 
  189.                       mov cx,es:[3fch]             ;被保存的bx的值??????
  190.                       mov ax,cx                     
  191.                       jcxz _init_data               ;检测第一次循环bx是否为零,若为零则跳过-2步骤
  192.                       mov dx,0
  193.                       mov cx,2
  194.                       div cx                        ;4/2,8/2,12/2,16/2....
  195.                       mov bx,ax                     ;2,4,6,8....
  196.                                                 
  197. _init_data:     mov ax,ds:[bx+si+84]        ;ax的值是ne部分
  198.                       mov dx,0                     ;因为都是求余数,并且人数不会超过32位
  199. _divw_loop:   call divdw
  200.                       mov word ptr es:[3fah],cx   ;余数用来做显示位
  201.                       add word ptr es:[3fah],30h  ;转换成字符
  202.                       mov ax,word ptr es:[3fah]   ;放入ax
  203.                       mov ah,07h                   ;把ah变成颜色位
  204.                       mov word ptr es:[bp+di-14],ax   ;保存入显示缓冲中32-8-20
  205.                       mov ax,word ptr es:[3f8h]   ;低位商
  206.                       mov dx,0
  207.                       mov cx,ax
  208.                       jcxz _divw_out                ;只要低位商为零就跳出
  209.                                                 
  210.                       sub bp,2                      ;从右到左(从小到大)写数据
  211.                       jmp _divw_loop
  212. _divw_out:    pop word ptr es:[3fch]
  213.                       pop di
  214.                       pop bp
  215.                       pop si
  216.                       pop bx
  217.                                                 
  218.         ret        
  219.         
  220. covent_pcdi:                                      ;ip=013b  人均收入字符串处理
  221.                      push bx                     ;ip=00e0   人员字符串处理
  222.                      push si
  223.                      push bp
  224.                      push di
  225.                      push word ptr es:[3fch]
  226.                      mov ax,word ptr ds:[bx+si]      ;把资产低位当作被除数
  227.                      mov dx,word ptr ds:[bx+si+2]    ;把资产高位当作被除数
  228.                      push ax                           ;此处注意保存ax和dx的值
  229.                      push dx
  230.                                                 
  231.                      mov cx,es:[3fch]             ;被保存的bx的值??????
  232.                      mov ax,cx                     
  233.                      jcxz _init_ne_data               ;检测第一次循环bx是否为零,若为零则跳过-2步骤
  234.                      mov dx,0
  235.                      mov cx,2
  236.                      div cx                        ;4/2,8/2,12/2,16/2....
  237.                      mov bx,ax                     ;2,4,6,8....
  238.                                                 
  239. _init_ne_data: pop dx                          ;还原dx和ax的值
  240.                      pop ax
  241.                      mov cx,ds:[bx+si+84]
  242.                      mov word ptr es:[3f6h],cx   ;把人数当作除数
  243.                      call divdw
  244.                      mov word ptr es:[3fah],ax   ;商用来做人均收入的被除数
  245.                      mov word ptr es:[3f6h],10   ;循环中的除数,意思是缩小十倍
  246.                      mov dx,0
  247.         pcdi_:    call divdw
  248.                      mov word ptr es:[3fah],cx   ;余数用来做显示位
  249.                      add word ptr es:[3fah],30h  ;转换成字符
  250.                      mov ax,word ptr es:[3fah]   ;字符放入ax
  251.                      mov ah,07h                   ;把ah变成颜色位
  252.                      mov word ptr es:[bp+di-2],ax  ;保存入显示缓冲中
  253.                      mov ax,word ptr es:[3f8h]    ;低位商
  254.                      mov cx,ax
  255.                      jcxz pcdi_out                ;只要低位商为零就跳出
  256.                      sub bp,2                     ;从后往前放资产值
  257.                      jmp pcdi_
  258.                                                 
  259. pcdi_out:      pop word ptr es:[3fch]
  260.                      pop di
  261.                      pop bp
  262.                      pop si
  263.                      pop bx
  264.         ret        
  265.         
  266.         divdw:                    
  267.                     push ax     ip= 0175h
  268.                     mov ax,dx
  269.                    mov dx,0
  270.                     div word ptr es:[3f6h]    ;ax=ax/【x】 高位商  dx=ax/cx高位余  如果高位为零,则全为零
  271.                     mov bx,ax ;bx=ax 如果高位被除为零则取ES:[510]的值为商
  272.                     pop ax     ;ax=低位被除数 dx=在进行高位除法时作为高位被除数,低位时为余数(隐含高位被除数)
  273.                    div word ptr es:[3f6h]     ;dx:ax= 14240  / cx= 0f
  274.                    mov es:[3f8h],ax ;保存低位除法的商
  275.                    mov cx,dx  ;将余数保存在cx
  276.                    mov dx,bx  ;将商保存在dx(高位商)
  277.         ret        
  278. code ends
  279. end start
复制代码

运行结果.jpg

评分

参与人数 1鱼币 +3 收起 理由
传说。 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-25 01:31:34 | 显示全部楼层
碉堡了。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-25 01:34:00 | 显示全部楼层
楼主可有divdw 的解释?那里我不理解。 高16位 低16位怎么算出原数的商和余数。有推导么?
而且还是16进制的。搞不懂。跪求啊!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-25 09:41:07 From FishC Mobile | 显示全部楼层
传说。 发表于 2014-5-25 01:34
楼主可有divdw 的解释?那里我不理解。 高16位 低16位怎么算出原数的商和余数。有推导么?
而且还是16进制 ...

书里后面有公式证明 在附注5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-25 11:38:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-6 15:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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