鱼C论坛

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

汇编实验七计算人均收入并存放

[复制链接]
发表于 2013-6-9 22:21:35 | 显示全部楼层 |阅读模式
20鱼币
assume cs:codesg,ds:data,es:table
data segment
  db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  db '1993','1994','1995'  ;以上表示年份db
  
  dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197414
  dd 345980,490827,803530,1183000,1843000,2759000,375000,4649000,5937000
  
  dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  dw 11542,14430,15257,17800 ;以上是人数
data ends
teble segment
db 21 dup  ('year summ ne ??')
teble ends
codesg segment
start:
      mov ax,data ;原始地址 年份(0-53h) 收入(54h-0a7h) 人数(0a8h-0D1h)
   mov ds,ax
   
   mov ax,table ;目的地址
   mov es,ax    ;把数据放入es去
   
   mov bx,0
   mov si,0
   mov di,0
   mov cx,21
s:mov byte ptr ax,ds:[bx]
   mov byte ptr es:[di],ax
   
   mov byte ptr ax,ds:[bx+1]
   mov byte ptr es:[di+1],ax
   
   mov byte ptr ax,ds:[bx+2]
   mov byte ptr es:[di+2],ax
   
   mov byte ptr ax,ds:[bx+3]
   mov byte ptr es:[di+3],ax
   
   mov ax,ds:[bx+54h]
   mov bx,ds:[bx+56h]
   
   mov es:[di+5h],ax
   mov es:[di+7h],bx
   
   mov ax,ds:[si+0a8h]      
   mov es:[di+0ah],ax             ;0ah是怎么来的?
   
   mov ax,ds:[bx+54h]
   mov bx,ds:[bx+56h]   
   
   div word ptr  ds:[si+0a8h]
   mov es:[di+0dh],ax               ;为什么这里是0dh 怎么算的
   
   add bx,4
   add si,2
  add di,16   
   loop s
   mov ax,4c00h
   int 21h
codesg ends
end start

最佳答案

查看完整内容

我有点怀疑你这程序是跑不动的 另外 mov ax,ds:[si+0a8h] mov es:[di+0ah],ax ;0ah是怎么来的? 第一次循环是把人数3,移动到summ和ne之间空格这个位置,这个位置刚好是0ah (year summ ne ??) mov es:[di+0dh],ax ;为什么这里是0dh 怎么算的 od的位置是 ne和??之间这个位置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-9 22:21:36 | 显示全部楼层
我有点怀疑你这程序是跑不动的
另外
   mov ax,ds:[si+0a8h]      
   mov es:[di+0ah],ax     ;0ah是怎么来的?
第一次循环是把人数3,移动到summ和ne之间空格这个位置,这个位置刚好是0ah  (year summ ne ??)

mov es:[di+0dh],ax               ;为什么这里是0dh 怎么算的
od的位置是 ne和??之间这个位置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-10 14:21:19 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-13 15:11:59 | 显示全部楼层
用我的代码吧,我的能用
assume cs:code,ds:data,es:table
table segment
    ;年份
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
    db '1993','1994','1995'  ;21*4=84数字
   
    ;偏移84,收入
    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
    dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000;21*4=84
   
    ;偏移168,雇员
    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw 11542,14430,15257,17800;21*2=42
   
    ;偏移210,人均收入
    dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
    dw 260,304,333
table ends
data segment
    db 32 dup (0)
;1995    5937000    17800    333      
;        8          19       28   
data ends
code segment
start:   
    mov ax,table
    mov es,ax
    mov ax,data
    mov ds,ax
    mov di,0;指向table,es里的年份和收入
    mov bp,0;指向table,es里的雇员和人均收入
    mov bl,3;从第3行开始显示
    mov cx,21;循环21次,一次显示一行,每行里读到e即65h时停止显示
   
  s:;移动年份  
    push cx  
    mov si,0;指向data,ds
    mov cx,16
s0:mov ds:[si],word ptr 0 ;将ds:[si]中的数据清零
    add si,2
    loop s0
    mov si,0
    mov ax,es:[di]
    mov ds:[si],ax
    mov ax,es:[di+2]
    mov ds:[si+2],ax

   
    ;移动收入
    mov ax,es:[di+84]
    mov dx,es:[di+84+2]
    mov cx,10
    mov si,8
    call dtoc
   
    ;移动雇员
    mov ax,es:[bp+168]
    mov dx,0
    mov cx,10
    mov si,19
    call dtoc
   
    ;移动人均收入
    mov ax,es:[bp+210]
    mov dx,0
    mov cx,10
    mov si,28
    call dtoc
   
    mov byte ptr ds:[31],65h;用e来判断结束,e的ASC2码为65h
   
    mov dh,bl;行号,0~24
    mov dl,10;列号,0~79
    mov cl,2;颜色
    mov si,0;ds:si指向字符串的首地址
    call show_str
    inc bl
    add di,4
    add bp,2
    pop cx
    loop s
       
    mov ax,4c00h
    int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;               
show_str:
    push ax
    push bx
    push cx
    push dx
    push di
    push ds
    push es
    push si
   
    mov al,0a0h
    mul dh
    mov di,ax;获得行号地址
    mov al,2
    mul dl;获得列号地址
    add di,ax;获得列号后,相加知道偏移地址
    mov ax,0B800H
    mov es,ax;显存地址 es:di
   
    mov bh,cl
    mov cl,0
show_str_s:
    mov bl,ds:[si];用bx来显示
    mov ch,bl
    sub ch,65h;读到是65h时,停止显示
    jcxz show_str_ok
   

    mov es:[di],bx
    add di,2;这里是加2,不是加1
    inc si
    jmp short show_str_s
   
show_str_ok:
    pop si
    pop es
    pop ds
    pop di
    pop dx
    pop cx
    pop bx
    pop ax
    ret       
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dtoc:
    push bx
    push di
    push ds
    push es
    push si
   
    mov di,0;这里要注意
dtoc_s:   
    call divdw  
    ;进行不会产生溢出的除法运算
    ;返回结果 dx高16位,ax为低16位
    ;cx为余数
    add cx,30h
    push cx
    inc di;记录入栈个数
    mov cx,dx
    or cx,ax
    jcxz dtoc_ok
    mov cx,0ah;N
    jmp dtoc_s
dtoc_ok:
    mov cx,di
dtoc_pop:
    pop dx
    mov ds:[si],dl;出栈将值放进ds:[si]
    inc si
    loop dtoc_pop
    pop si
    pop es
    pop ds
    pop di
    pop bx
    ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;     
   
divdw:
    push bx
    push di
    push ds
    push es
    push si
   
    mov di,ax;先备份好L
    mov ax,dx
    mov dx,0
    div cx
    mov bx,ax;注意ax就是int(H/N)*65536的值,而这时的dx就是rem(H/N)*65536
    mov ax,di;把存的L拿出来用
    div cx
    mov cx,dx
    mov dx,bx
   
    pop si
    pop es
    pop ds
    pop di
    pop bx
    ret
   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
code ends
end start

评分

参与人数 2鱼币 +7 收起 理由
网友 + 3 感谢楼主无私奉献!
s0512 + 4 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2013-6-13 15:52:44 | 显示全部楼层
你这代码也忒长了....实在是受不了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 09:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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