修炼中 发表于 2014-1-2 20:44:23

汇编语言 试验七

在王爽老师写的汇编语言一书中,第八章 试验七,为什么代码写完,最后的结果却是这样的呢
除了年份是正确显示的,其他几样全部是乱码

有大神能教我们一下吗?
我想了半天,也不知道怎么才能正确显示
定义字符串也不好定义,在代码中进行转换也不会
大神教一下

修炼中 发表于 2014-1-2 22:19:36

assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986'
db '1987','1988','1989','1990','1991','1992','1993','1994','1995'
;上面是21年的21个字符串
dd 16,22,382,1356,2390h,8000h,16000,24486,50065,97479,140417,197514,345980
dd 590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;上面是21年总收入的21个dword型数据
dw 3,7,9,13,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 ('your summ ne ?? ')
table ends
code segment
start:    mov ax,data
          mov ds,ax
                  mov ax,table
                  mov es,ax
                  mov si,0
                  mov cx,21
                  mov bx,0
        s:    mov ax,ds:      ;这里是年份的21个数据的写入
                  mov es:,ax
                  add bx,2
                  mov ax,ds:
                  mov es:,ax
                  add bx,2
                  add si,16
                  loop s               ;这里结束
                  mov bx,84
                  mov si,5
                  mov cx,21
        s1:          mov ax,ds:         ;这里是收入写入
                  mov es:,ax
                  add bx,2
                  mov ax,ds:
                  mov es:,ax
                  add bx,2
                  add si,16
                  loop s1               ;收入写入结束
          mov bx,168
          mov si,10
          mov cx,21                  
        s2:   mov ax,ds:
              mov es:,ax
                  add bx,2
                  add si,16
                  loop s2
                  mov si,10
                  mov bx,5
                  mov cx,21
        s3:          mov ax,es:
                  mov dx,es:
                  div word ptr es:
                  mov es:,ax
                  add bx,16
                  add si,16
                  loop s3
                  mov ax,4c00h
                  int 21h
code ends
end start

sokou001 发表于 2014-1-2 22:49:25

  s:    mov ax,ds:        ;这里是年份的21个数据的写入 定义的是db 干嘛用ax 做字的 传送呢

修炼中 发表于 2014-1-2 23:38:26

sokou001 发表于 2014-1-2 22:49 static/image/common/back.gif
  s:    mov ax,ds:        ;这里是年份的21个数据的写入 定 ...

:titter:偷懒啊,用字节传送要四次啊,定义的是db,同时也是字符串,字符串中有4个元素,也就是4个字节
用字传送的话快一倍吧!

至于能不能这样用我还真不知道呢,反正结果没出错

修炼中 发表于 2014-1-2 23:39:50

现在顺便写上我的第二种方法,好像代码稍微少一点

修炼中 发表于 2014-1-2 23:41:17

assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985'
db '1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
;以上是年份,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个双字型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,45257,17800
;以上是公司员工数量,21个字型数据
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends

code segment
            start:   mov ax,data
                        mov ds,ax
                        mov ax,table
                        mov es,ax
                        mov bx,0;年份偏移
                        mov bp,84;总收入偏移
                        mov si,168;公司人数偏移
                        mov di,0;表格段行数偏移
                        mov cx,21
        s:                mov ax,ds:      ;年份
                        mov es:,ax
                        mov ax,ds:
                        mov es:,ax ;年份写入结束
                        mov ax,ds:      ;总收入
                        mov es:,ax
                        mov ax,ds:
                        mov es:,ax    ;总收入写入结束
                        mov ax,ds:       ;人数
                        mov es:,ax    ;人数写入结束
                        mov ax,es:   ;人均收入
                        mov dx,es:
                        div word ptr es:
                        mov es:,ax   ;人均收入结束
                        add bx,4   ;第一行写入完毕,数据段中年份往前4个字节
                        add bp,4   ; ·······················总收入往前4个字节
                        add si,2   ;························人数往前2个字节
                        add di,16;························表格中进行第二行写入
                        loop s
                        mov ax,4c00h
                        int 21h
code ends
end start

修炼中 发表于 2014-1-2 23:49:28

话说,现在也想通了,debug右边只能显示16个字符串,所以不可能完整的显示出来

在想想,程序是否正确也是可以检验的

在对应的地址中有acsii码对应的16进制数,把这些16进制数转换成10进制,在和自己计算的商对照一下就知道了

sokou001 发表于 2014-1-3 00:09:12

{:7_178:} 我也快做到这题 了 现在弄着那个富豪排名38呢

修炼中 发表于 2014-1-3 01:19:06

经过又一个多小时的努力,有优化了下,减少了好几行代码
assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985'
db '1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
;以上是年份,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个双字型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,45257,17800
;以上是公司员工数量,21个字型数据
data ends
table segment
db 21 dup('year summ ne ?? ')
table ends

code segment
             start:   mov ax,data
                        mov ds,ax
                        mov ax,table
                        mov es,ax
                        mov bx,0;年份偏移
                        mov bp,84;总收入偏移
                        mov si,168;公司人数偏移
                        mov di,0;表格段行数偏移
                        mov cx,21
        s:                mov ax,ds:      ;年份
                        mov es:,ax
                        mov ax,ds:
                        mov es:,ax ;年份写入结束
                       
                        mov ax,ds:       ;人数
                        mov es:,ax    ;人数写入结束
                       
                        mov ax,ds:      ;总收入
                        mov es:,ax
                        mov dx,ds:
                        mov es:,dx    ;总收入写入结束
                       
                        div word ptr es:;人均收入
                        mov es:,ax   ;人均收入结束
                       
                        add bx,4   ;第一行写入完毕,数据段中年份往前4个字节
                        add bp,4   ; ·············································总收入往前4个字节
                        add si,2    ;···············································人数往前2个字节
                        add di,16;···············································表格中进行第二行写入
                        loop s
                        mov ax,4c00h
                        int 21h
code ends
end start

智商是硬伤 发表于 2015-8-17 10:59:03

{:7_146:}咱们码农有力量,嘿{:7_146:}
页: [1]
查看完整版本: 汇编语言 试验七