鱼C论坛

 找回密码
 立即注册
查看: 3328|回复: 11

汇编语言

[复制链接]
发表于 2012-3-26 23:44:42 | 显示全部楼层 |阅读模式
1鱼币
王爽老师的《汇编语言》中实验7,请帮忙看看哪里出错了,先谢谢了。


assume cs:code,ds:data,es:table
  data segment
   db '1975','1976','1977','1978','1979','1980','1981','1882','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,197514
   dd 11542,14430,15257,17800
  
   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 summ ne ?? ')
   table ends
code segment
strat: mov ax,data
       mov ds,ax
    mov ax,table
    mov es,ax
    mov bx,0
    mov di,0
    mov si,0
    mov bp,0
    mov cx,21
s: mov ax,[di]
    mov es:[bx],ax
    add di,2
    mov ax,[di]
    add di,2
    mov es:2[bx],ax
    mov ax,ds:08ah[bp]
    add bp,2
    mov es:0ah[bx],ax
    mov ax,54h[si]
    add si,2
    mov dx,54h[si]
    mov es:5[bx],ax
    mov es:7[bx],dx
    div word ptr ds:54h[bp]
    mov es:0dh[bx],ax
    add bx,10h
    loop s
   
    mov ax,4c00h
    int 21h
   
   code ends
end strat  

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-27 00:39:58 | 显示全部楼层
dp 改下别的别的吧,DI也可以,DP是栈的,不知道你这样用行不行,我没试过,每个人都有书写方式的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-27 01:39:14 | 显示全部楼层
编译都通过了 ,你说是哪里错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-27 01:55:25 | 显示全部楼层
首先你很乱,1:为什么用两个ADD DI,2  ;2:08AH是哪里的开始?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-27 04:15:59 | 显示全部楼层
写的好乱,建议后面注释一下,编译通过不代表程序正确;P
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-27 16:46:45 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-3-27 17:15 编辑

首先 给你看下你自己的代码 (有些地方我看的时候按照我的习惯改了点不影响你的思路)
assume cs:code,ds:data,es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1882','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,197514
dd 11542,14430,15257,17800

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 summ ne ?? ')
table ends
code segment
strat: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov di,0
mov si,0
mov bp,0
mov cx,21

s: mov ax,[di]
mov es:[bx],ax
add di,2 
mov ax,[di] 
add di,2      
;mov es:[bx+2],ax ;年份入es


mov ax,ds:[08ah+bp] ;这里是0a8h 人数   而且这个bp 也可以用di 变量代替  因为你前面+了一个常量确定了开始位置
add bp,2                      
mov es:[0ah+bx],ax 


mov ax,[54h+si]
add si,2
mov dx,[54h+si] 
mov es:[5+bx],ax
mov es:[7+bx],dx ;收入

div word ptr ds:[54h+bp] ;这里除以人数 你的 ds:[54h+bp] 指向的也不是人数阿 
mov es:[0dh+bx],ax ;平均工资入es
add bx,10h
loop s

mov ax,4c00h
int 21h

code ends
end strat 
严重的影响程序正确的就是那句除法  没找对除数!

还有比较有意思的问题就是
  mov ax,[di]
mov es:[bx],ax   
add di,2 ;  
mov ax,[di]    为什么要 add di,2 不直接写成 mov ax,[di+2]
add di,2

而且
mov ax,[54h+si]  这里你都已经定了54h这个位置了     下面的si +2
add si,2
mov dx,[54h+si]     2也是常数为什么不直接写成56h+si
mov es:[5+bx],ax
mov es:[7+bx],dx ;收入

这个程序一趟是按照思路写出來了
但是让人看起来很累 有些你找到地方的直接可以用idate常量表示的
你还要增加一句add  给加到变量上
这样写一旦你疏忽一个位置 就可能整个程序数据错位一大截  

程序写出來要根据思路增加空格 空行 方便以后注释 或者自己看的时候明白 上一个段是进行什么操作
找准一个位置 用变量+常数来指向   然后在前面的代码都执行完以后统一对变量进行增加减少操作

程序还有错的地方 应该是某个地方加到后来加错了 时间关系给你发一段差不多的代码你对比下(以前一个兄弟发出來要求精简的)
assume cs:code 
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,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 ('year summ ne ?? ')
table ends
code segment
start:mov ax,data
mov ds,ax ;data段地址与ds挂钩

mov ax,table
mov es,ax ;satle段地址与ex挂钩

mov cx,21 ;循环次数21
mov di,0
mov bx,0 
mov si,0 ;初始化
s: mov ax,[bx]
mov es:[di],ax
mov ax,2h[bx]
mov es:2h[di],ax ;导入table段年份数据

mov ax,54h[bx]
mov es:[5+di],ax 
mov dx,56h[bx]
mov es:[7+di],dx ;导入table段收入数据

mov ax,0a8h[si]
mov es:[0ah+di],ax ;导入table雇员数

mov ax,es:[5+di] 
mov dx,es:[7+di]
div word ptr es:[0ah+di] ;计算平均工资
mov es:[0dh+di],ax ;商存入内存

add bx,4 ;data段年份收入偏移地址递增4
add si,2 ;data段雇员数偏移递增2
add di,16 ;table段递增一行

loop s
mov ax,4c00h
int 21h
code ends
end start 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-28 17:04:54 | 显示全部楼层

为什么出来的结果是
1475:000D BF0000        MOV     DI,0000
-g 0053

AX=014D  BX=0054  CX=0000  DX=2580  SP=0000  BP=0000  SI=002A  DI=0150
DS=1452  ES=1460  SS=1452  CS=1475  IP=0053   NV UP EI PL NZ NA PE NC
1475:0053 B8004C        MOV     AX,4C00
-d es:0
1460:0000  31 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20   1975 .... .. ..
1460:0010  31 39 37 36 20 16 00 00-00 20 07 00 20 03 00 20   1976 .... .. ..
1460:0020  31 39 37 37 20 7E 01 00-00 20 09 00 20 2A 00 20   1977 ~... .. *.
1460:0030  31 39 37 38 20 4C 05 00-00 20 0D 00 20 68 00 20   1978 L... .. h.
1460:0040  31 39 37 39 20 56 09 00-00 20 1C 00 20 55 00 20   1979 V... .. U.
1460:0050  31 39 38 30 20 40 1F 00-00 20 26 00 20 D2 00 20   1980 @... &. ..
1460:0060  31 39 38 31 20 80 3E 00-00 20 82 00 20 7B 00 20   1981 .>.. .. {.
1460:0070  31 39 38 32 20 A6 5F 00-00 20 DC 00 20 6F 00 20   1982 ._.. .. o.
-d
1460:0080  31 39 38 33 20 91 C3 00-00 20 DC 01 20 69 00 20   1983 .... .. i.
1460:0090  31 39 38 34 20 C7 7C 01-00 20 0A 03 20 7D 00 20   1984 .|.. .. }.
1460:00A0  31 39 38 35 20 81 24 02-00 20 E9 03 20 8C 00 20   1985 .$.. .. ..
1460:00B0  31 39 38 36 20 8A 03 03-00 20 A2 05 20 88 00 20   1986 .... .. ..
1460:00C0  31 39 38 37 20 7C 47 05-00 20 D2 08 20 99 00 20   1987 |G.. .. ..
1460:00D0  31 39 38 38 20 EB 03 09-00 20 E9 0A 20 D3 00 20   1988 .... .. ..
1460:00E0  31 39 38 39 20 CA 42 0C-00 20 C5 0F 20 C7 00 20   1989 .B.. .. ..
1460:00F0  31 39 39 30 20 18 0D 12-00 20 03 16 20 D1 00 20   1990 .... .. ..
-只能将年份存进去,而别的不行,是我的电脑有什么问题么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-28 17:07:24 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-3-28 17:14 编辑
ぅ不想懂得ぃ 发表于 2012-3-28 17:04
为什么出来的结果是
1475:000D BF0000        MOV     DI,0000
-g 0053


其实存进去了 只不过后面的代码 ascii码 不能显示出來 只有数字的才能显示出來
                     db  1975    空格  dd 收入16 空格dw 人数 平均工资
460:0000  31 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20   1975 .... .. ..
具体数据忘记了大概就这个意思 你看看对应数据是不是按照顺序拍进去的


而且还有 ....刚写这个的时候才发现我说怎么老除法溢出错误呢 你看看你代码段收入那段数据..........后面都错了!!!!!!!


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

使用道具 举报

发表于 2012-3-28 17:34:33 | 显示全部楼层
莫名其妙 发表于 2012-3-28 17:07
其实存进去了 只不过后面的代码 ascii码 不能显示出來 只有数字的才能显示出來
                      ...

嗯嗯,那为什么显示不出来啊,不是机器码的右端是显示ascii码,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-28 19:11:39 | 显示全部楼层
ぅ不想懂得ぃ 发表于 2012-3-28 17:34
嗯嗯,那为什么显示不出来啊,不是机器码的右端是显示ascii码,

对 显示对应的ascii码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-29 23:12:15 | 显示全部楼层
莫名其妙 发表于 2012-3-28 19:11
对 显示对应的ascii码

那是什么原因不能显示啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-30 08:29:59 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-3-30 08:31 编辑
ぅ不想懂得ぃ 发表于 2012-3-29 23:12
那是什么原因不能显示啊?


他不是按照每一位数据一个字节进行存放ascii码的 比如说数据 dw 65535 你认为是一个整数据 但是在内存里他就是
FF  FF  这样显示的  而FF对应的ascii码是什么.....不知道. so !!~你懂了木有?
如果你还要问为什么年份能显示出來 因为年份是db型 你是吧1997 拆开变成1    9    9   7 一位一位的数据来输入的所以能显示出來
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-20 01:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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