|
主题 : : 绝了!比置顶程序还要牛的程序,不另外定义段,只用23条汇编指令完成程序要求。比最牛程序少用了七行代码。 [待解决] |
回复[ 66次 ]
点击[ 6561次 ] | |
|
|
|
|
[帖 主] [ 发表时间:2009-07-02 10:50 ] | |
荣誉值:0
信誉值:0
注册日期:2008-09-26 07:46 |
code segment
start:mov ax,data
mov ds,ax
mov bx,0
mov si,0a8h
mov ax,table
mov ss,ax
mov bp,0
mov cx,21
s:mov ax,[si]
mov [bp+0ah],ax
mov ax,[bx]
mov dx,{bx+2}
mov [bp],ax
mov [bp+2],dx
mov ax,[54h+bx]
mov dx,[56h+bx]
mov [bp+05h],ax
mov [bp+07h],dx
div word ptr [bp+0ah]
mov [bp+0dh],ax
add bx,4
add si,2
add bp,10h
loop s
mov ax,4c00h
int 21h
code ends
end start
我的QQ:479488993 我的博客:http://www.asmedu.net/blog/user/usermain.jsp?neighborId=14266 希望与热爱技术的人为伍。 | | |
|
|
|
|
[第16楼] [ 回复时间:2010-07-22 21:15 ] | |
荣誉值:0
信誉值:0
注册日期:2010-07-22 20:52 |
为了说说我的看法只好注册个号了。。。
楼主的有一行代码错了, mov dx,{bx+2} 应该是mov dx,[bx+2]
不过这个不是大问题,我觉得最不好的地方是你用了SS,也就是把默认的堆栈当普通数据寄存用了,感觉不规范。。。
3楼的思路是对的,可惜基本功。。。竟然写出了mov es:[si+5] 这样的句子,后边的,ax呢?所以要多写多练习,尤其是你没有注释和分段,这样的程序大了之后很难读
6楼的没用div就做出来了让我惊讶,很仔细地看完,发现你没看清题目,请继续审题。。。
7楼的不知道你们试了没有,肯定出问题,因为他把收入跟员工数的顺序弄反了,估计是学习了那个很多push例子的某位牛人的思路,可惜没有深刻理解为什么那位牛人没有用ax而用了dx做传递,不过只要把顺序调过来就是这个版最好的源码
8楼的没话说,确实很好,除了结构和注释上应该努力,养成好习惯,其他perfect,尤其是学了2天写出来的,很强大。。。
assume cs:code, ds:data, es:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982'
db '1983','1984','1985','1986','1987','1988','1989','1990'
db '1991','1992','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个双字型数据
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个字型数据
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 si,0
mov di,0 ;初始化偏移量,bx是表格行偏移,si是年份字偏移,di是年份双字偏移
mov cx,21 ;初始化循环计数器
s:
mov ax,[di+0]
mov es:[bx],ax
mov ax,[di+2]
mov es:[bx+2],ax ;对年份的处理
mov ax,168[si]
mov es:[bx+10],ax ;对雇员的处理
mov ax,84[di]
mov es:[bx+5],ax
mov dx,86[di]
mov es:[bx+7],dx ;对总收入的处理,使用dx是因为不用重复赋值
div word ptr es:[bx+10]
mov es:[bx+13],ax ;对平均收入的处理
add si,2
add bx,16
add di,4 ;偏移量增值
loop s
mov ax,4c00h
int 21h
code ends
end start
这个是我写的,第一次写的没这么好,吸收了很多牛人的例子相信是不用push里最好的之一了。。。 | | |
|