青草 发表于 2013-2-13 11:32:35

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

以上是自己写的第八章实验代码   用时一天半但写出来只用了3个小时 一开始因为数据3种 被型的乱的 所以本以为一天能写出来 结果还是后来理清条理 3个小时左右写出来了 程序不是很有效率可是因为学习进程慢 所以只能在次投入书本内 就不在这里一个人纠结了 用最快的方式 求高手辅导各位高手请将代码写进回复中 我会一一masm和debug一次 谢谢啦
本人写的代码如下:
———————————————————————————————————————————————————
assumecs: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:               ;取出源目标内的数据段(年份按字节取)
       mov byte ptr es:,al   ;写入数据目的段 (年份按字节写)
       mov al,ds:            ;取数据(按字节取出公司总收入,取4次相当于两个字,即双字节)
       mov byte ptr es:,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:,' '
       mov byte ptr es:,' '
       mov byte ptr es:,' '
       mov word ptr es:,'?'
       mov byte ptr es:,' '
       add bx,16
       loop a
       mov bx,0
       mov si,0
       mov cx,21                      ;因为字型数据不能按字节取4次 所以些次21次单独操作         
   b:mov ax,ds:            ;取出目标段中的公司雇员(按字取出)
       mov word ptr es:,ax   ;进行字操作写入格式化数据段内
       add bx,2
       add si,16
       loop b                         ;注因为写习进展原因所以这不是精减版的,上面的标号a、b两个循环可以合并成一个循环

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

小小小小鱼 发表于 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,
             mov ,ax
                   mov ax,
                   mov ,ax
                  
             add bx,2
                   mov dx,
                   mov ,dx
                   mov dx,
                   mov ,dx
                   add bx,2
                  
                   mov di,
                   mov ,di
                   add si,2
                  
                   div word ptr
                   mov ,ax
                   add bp,10h
                   loop s
       
         
         mov ax,4c00h
         int 21h
code ends
end start
                   一次循环搞定

青草 发表于 2013-2-13 13:14:36

assumecs: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:               ;取出源目标内的数据段(年份按字节取)
       mov byte ptr es:,al   ;写入数据目的段 (年份按字节写)
       mov al,ds:            ;取数据(按字节取出公司总收入,取4次相当于两个字,即双字节)
       mov byte ptr es:,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:,' '
       mov byte ptr es:,' '
       mov byte ptr es:,' '
       mov word ptr es:,'?'
       mov byte ptr es:,' '
       add bx,16
       loop a

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



       mov ax,4c00H
       int 21H
codesg ends

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

end zeeg

****************************************************************************************
以上代码集成了 求人均收入工能

binlaniua 发表于 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,                         ;放置年份
            mov word ptr ,ax      
            mov ax,
            mov word ptr ,ax
            
            mov byte ptr , ' '          ;放置空格
            
            mov ax,                   ;放置收入
            mov word ptr , ax
            mov ax,
            mov word ptr , ax
            
            mov byte ptr , ' '          ;放置空格
            
            mov ax,                  ;放置雇员数, 由于雇员数是字节, 只能用si作为偏移
            mov word ptr , ax
            
            mov byte ptr , ' '      ;放置空格
            
            mov dx,                   ;计算人均, 高16位放dx, 低16位放ax
            mov ax,
            div word ptr
            mov word ptr , ax         ;放商
            
            add bp, 10H                         ;换下一行继续放置
            add bx, 4h                        ;换下一个年份
            add si, 2
            loop s
            
            mov ax,4c00H
            int 21H
code ends
end start

青草 发表于 2013-4-11 07:42:58

真是被感动的痛哭流涕……
页: [1]
查看完整版本: 王爽第八章实验,求高手来找茬