鱼C论坛

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

王爽第八章实验,求高手来找茬

[复制链接]
发表于 2013-2-13 11:32:35 | 显示全部楼层 |阅读模式
1鱼币
以上是自己写的第八章实验代码   用时一天半  但写出来只用了3个小时 一开始因为数据3种 被型的乱的 所以本以为一天能写出来 结果还是后来理清条理 3个小时左右写出来了 程序不是很有效率  可是因为学习进程慢 所以只能在次投入书本内 就不在这里一个人纠结了 用最快的方式 求高手辅导  各位高手请将代码写进回复中 我会一一masm和debug一次 谢谢啦
本人写的代码如下:
———————————————————————————————————————————————————
assume  cs:codesg
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'
     ;以上是表示21年的21个字符串(字型数据)
     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
     dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
     ;以上是表示21年公司总收入的21个DWORD型数据(双字型数据)
     dw 3,7,9,12,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
     dw 11542,14430,15257,17800
     ;以上是表示21年公司雇员人数的21个word型数据(字型数据)
data ends
table segment      ;要格式化数据段
     db 21 dup ('year summ en ??')   
table ends
zeeg1 segment
     dw 8 dup ('0')
zeeg1 ends
codesg segment
  zeeg:mov ax,data
       mov ds,ax        ;确定复制数据源目标段
       mov ax,table
       mov es,ax        ;确定复制数据目的段
       mov ax,zeeg1
       mov ss,ax        ;数据占存处
       mov sp,16
       mov ax,0
       mov bx,0
       mov bp,0
       mov si,0
      
       mov cx,21                      ;定义21个行
     z:push cx                        ;因为要用到嵌套循环所以要保存循环次数
       mov cx,4                       ;定位4位字节型娄循环
     s:mov al,ds:[bx]                 ;取出源目标内的数据段(年份按字节取)
       mov byte ptr es:[bp+si],al     ;写入数据目的段 (年份按字节写)
       mov al,ds:[bx+84]              ;取数据(按字节取出公司总收入,取4次相当于两个字,即双字节)
       mov byte ptr es:[bp+si+5],al   ;写和数据
       inc bx
       inc si
       loop s
       add dx,16                      ;行定位(增加行)
       add bp,12                      ;列定位(在行的基础上定位列)
       pop cx                         ;还原循环次数
       loop z

       mov bx,0
       mov cx,21                      ;此次21次循环用来给指定格式化数据段内的指定列中写入要求中的空格和问号
     a:mov byte ptr es:[bx+4],' '
       mov byte ptr es:[bx+9],' '
       mov byte ptr es:[bx+12],' '
       mov word ptr es:[bx+13],'?'
       mov byte ptr es:[bx+15],' '
       add bx,16
       loop a
       mov bx,0
       mov si,0
       mov cx,21                      ;因为字型数据不能按字节取4次 所以些次21次单独操作         
     b:mov ax,ds:[bx+0A8H]            ;取出目标段中的公司雇员(按字取出)
       mov word ptr es:[si+10],ax     ;进行字操作写入格式化数据段内
       add bx,2
       add si,16
       loop b                         ;注因为写习进展原因所以这不是精减版的,上面的标号a、b两个循环可以合并成一个循环

       mov ax,4c00H
       int 21H
codesg ends
end zeeg
————————————————————————————————————————————————————

最佳答案

查看完整内容

assume cs:code,ds:date,es:table date 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' dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5973000 dw 3,7,9,13,28,38,130,220,476,778,100 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-13 11:32:36 | 显示全部楼层
assume cs:code,ds:date,es:table
date 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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514           
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5973000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226         
dw 11542,14430,15257,17800
date ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
code segment
    start: mov ax,date
               mov ds,ax
                   mov ax,table
                   mov ss,ax
                   mov bx,0
                   mov bp,0
                   mov si,0
                   mov cx,21
       
        s:     mov ax,[bx]
               mov [bp],ax
                   mov ax,[bx+54h]
                   mov [bp+5],ax
                  
               add bx,2
                   mov dx,[bx]
                   mov [bp+2],dx
                   mov dx,[bx+54h]
                   mov [bp+7],dx
                   add bx,2
                  
                   mov di,[si+0a8h]
                   mov [bp+10],di
                   add si,2
                  
                   div word ptr [bp+11]
                   mov [bp+13],ax
                   add bp,10h
                   loop s
       
           
           mov ax,4c00h
           int 21h
  code ends
end start  
                   一次循环搞定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-13 13:14:36 | 显示全部楼层
assume  cs:codesg
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'
     ;以上是表示21年的21个字符串(字型数据)

     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
     dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
     ;以上是表示21年公司总收入的21个DWORD型数据(双字型数据)

     dw 3,7,9,12,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
     dw 11542,14430,15257,17800
     ;以上是表示21年公司雇员人数的21个word型数据(字型数据)
data ends

table segment      ;要格式化数据段
     db 21 dup ('year summ en ??')   
table ends

codesg segment
  zeeg:mov ax,data
       mov ds,ax        ;确定复制数据源目标段
       mov ax,table
       mov es,ax        ;确定复制数据目的段
       mov ax,zeeg1
       mov ss,ax        ;数据占存处
       mov sp,20
       mov ax,0
       mov bx,0
       mov bp,0
       mov si,0

      
       mov cx,21                      ;定义21个行
     z:push cx                        ;因为要用到嵌套循环所以要保存循环次数
       mov cx,4                       ;定位4位字节型娄循环
     s:mov al,ds:[bx]                 ;取出源目标内的数据段(年份按字节取)
       mov byte ptr es:[bp+si],al     ;写入数据目的段 (年份按字节写)
       mov al,ds:[bx+84]              ;取数据(按字节取出公司总收入,取4次相当于两个字,即双字节)
       mov byte ptr es:[bp+si+5],al   ;写和数据
       inc bx
       inc si
       loop s
       add dx,16                      ;行定位(增加行)
       add bp,12                      ;列定位(在行的基础上定位列)
       pop cx                         ;还原循环次数
       loop z

       mov bx,0
       mov cx,21                      ;此次21次循环用来给指定格式化数据段内的指定列中写入要求中的空格和问号
     a:mov byte ptr es:[bx+4],' '
       mov byte ptr es:[bx+9],' '
       mov byte ptr es:[bx+12],' '
       mov word ptr es:[bx+13],'?'
       mov byte ptr es:[bx+15],' '
       add bx,16
       loop a

       mov bx,0
       mov si,0
       mov cx,21                      ;因为字型数据不能按字节取4次 所以些次21次单独操作         
     b:mov ax,ds:[bx+0A8H]            ;取出目标段中的公司雇员(按字取出)
       mov word ptr es:[si+10],ax     ;进行字操作写入格式化数据段内
       add bx,2
       add si,16
       loop b                         ;注因为写习进展原因所以这不是精减版的,上面的标号a、b两个循环可以合并成一个循环
     
       mov bp,0
       mov cx,21                      ;进行除法(求取雇员的人均收入)
     g:mov ax,es:[bp+5]
       mov dx,es:[bp+7]
       mov bx,es:[bp+10]
       div bx
       mov word ptr es:[bp+13],ax
       add bp,16
       loop g



       mov ax,4c00H
       int 21H
codesg ends

zeeg1 segment                        ;此段定义在前面会出现格式化段最后一行数据被修改情况
     db 20 dup ('@')
zeeg1 ends

end zeeg

****************************************************************************************
以上代码集成了 求人均收入工能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-10 14:08:32 | 显示全部楼层
assume cs:code,ds:data,ss: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'
    ;收入
    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514           
    dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5973000 
    ;雇员数
    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

table segment
    db 21 dup('year sume ne ?? ')
table ends

code segment
    start: 
            mov ax,data
            mov ds,ax                           ;ds设置为data地址
            mov ax,table
            mov ss,ax                           ;es设置为table地址
            mov bx,0
            mov bp,0
            mov si,0
            mov cx,21                           ;重复21次
            
        s:  mov ax,[bx]                         ;放置年份
            mov word ptr [bp],ax       
            mov ax,[bx + 2]
            mov word ptr [bp + 2],ax
            
            mov byte ptr [bp + 4], ' '          ;放置空格
            
            mov ax,[bx + 54h]                   ;放置收入
            mov word ptr [bp + 5], ax 
            mov ax,[bx + 56h]
            mov word ptr [bp + 7], ax
            
            mov byte ptr [bp + 9], ' '          ;放置空格
            
            mov ax,[si + 0A8h]                  ;放置雇员数, 由于雇员数是字节, 只能用si作为偏移
            mov word ptr [bp + 0ah], ax
            
            mov byte ptr [bp + 0ch], ' '        ;放置空格
            
            mov dx,[bx + 56h]                   ;计算人均, 高16位放dx, 低16位放ax
            mov ax,[bx + 54h]
            div word ptr [si + 0a8h]
            mov word ptr [bp + 0dh], ax         ;放商
            
            add bp, 10H                         ;换下一行继续放置
            add bx, 4h                          ;换下一个年份
            add si, 2
            loop s
            
            mov ax,4c00H
            int 21H
code ends
end start

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

使用道具 举报

 楼主| 发表于 2013-4-11 07:42:58 | 显示全部楼层
真是被感动的痛哭流涕……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 20:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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