鱼C论坛

 找回密码
 立即注册
查看: 1832|回复: 9

汇编语言 试验七

[复制链接]
发表于 2014-1-2 20:44:23 | 显示全部楼层 |阅读模式

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

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

x
在王爽老师写的汇编语言一书中,第八章 试验七,为什么代码写完,最后的结果却是这样的呢
除了年份是正确显示的,其他几样全部是乱码
QQ图片20140102204001.jpg
有大神能教我们一下吗?
我想了半天,也不知道怎么才能正确显示
定义字符串也不好定义,在代码中进行转换也不会
大神教一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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:[bx]        ;这里是年份的21个数据的写入
                  mov es:[si],ax
                  add bx,2
                  mov ax,ds:[bx]
                  mov es:[si+2],ax
                  add bx,2
                  add si,16
                  loop s                 ;这里结束
                  mov bx,84
                  mov si,5
                  mov cx,21
        s1:          mov ax,ds:[bx]         ;这里是收入写入
                  mov es:[si],ax
                  add bx,2
                  mov ax,ds:[bx]
                  mov es:[si+2],ax
                  add bx,2
                  add si,16
                  loop s1               ;收入写入结束
          mov bx,168
          mov si,10
          mov cx,21                  
        s2:   mov ax,ds:[bx]
              mov es:[si],ax
                  add bx,2
                  add si,16
                  loop s2
                  mov si,10
                  mov bx,5
                  mov cx,21
        s3:          mov ax,es:[bx]
                  mov dx,es:[bx+2]
                  div word ptr es:[si]
                  mov es:[si+3],ax
                  add bx,16
                  add si,16
                  loop s3
                  mov ax,4c00h
                  int 21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-2 22:49:25 | 显示全部楼层
  s:    mov ax,ds:[bx]        ;这里是年份的21个数据的写入 定义的是db 干嘛用ax 做字的 传送呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-2 23:38:26 | 显示全部楼层

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

至于能不能这样用我还真不知道呢,反正结果没出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-2 23:39:50 | 显示全部楼层
现在顺便写上我的第二种方法,好像代码稍微少一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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:[bx]      ;年份
                        mov es:[di],ax
                        mov ax,ds:[bx+2]
                        mov es:[di+2],ax ;年份写入结束
                        mov ax,ds:[bp]      ;总收入
                        mov es:[di+5],ax
                        mov ax,ds:[bp+2]
                        mov es:[di+7],ax    ;总收入写入结束
                        mov ax,ds:[si]       ;人数
                        mov es:[di+10],ax    ;人数写入结束
                        mov ax,es:[di+5]     ;人均收入
                        mov dx,es:[di+7]
                        div word ptr es:[di+10]
                        mov es:[di+13],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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-2 23:49:28 | 显示全部楼层
话说,现在也想通了,debug右边只能显示16个字符串,所以不可能完整的显示出来

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

在对应的地址中有acsii码对应的16进制数,把这些16进制数转换成10进制,在和自己计算的商对照一下就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-3 00:09:12 | 显示全部楼层
{:7_178:} 我也快做到这题 了 现在弄着那个富豪排名38呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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:[bx]      ;年份
                        mov es:[di],ax
                        mov ax,ds:[bx+2]
                        mov es:[di+2],ax ;年份写入结束
                       
                        mov ax,ds:[si]       ;人数
                        mov es:[di+10],ax    ;人数写入结束
                       
                        mov ax,ds:[bp]      ;总收入
                        mov es:[di+5],ax
                        mov dx,ds:[bp+2]
                        mov es:[di+7],dx    ;总收入写入结束
                       
                        div word ptr es:[di+10];人均收入
                        mov es:[di+13],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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-17 10:59:03 | 显示全部楼层
咱们码农有力量,嘿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 20:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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