|
主题 : : 绝了!比置顶程序还要牛的程序,不另外定义段,只用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 希望与热爱技术的人为伍。 | | |
|
|
|
|
[第50楼] [ 回复时间:2015-06-23 18:12 ] | |
荣誉值:0
信誉值:0
注册日期:2015-06-19 10:06 |
我的代码。为了简便,我只造了5组数据,书上的21组太多了。
借鉴了以上各楼的思想,没有用栈。win7 64bit + DosBox 测试通过。
---------------------------------------------
; 结构化寻址演练
; 将公司数据输入表格并计算年人均收入
assume cs:code
data segment
db '1975', '1976', '1977', '1978', '1979' ; 年份
dd 345980, 590827, 803530, 1183000, 1843000 ; 总收入
dw 5635, 8226, 11542, 14430, 15257 ; 人数
data ends
table segment
db 5 dup ('year summ ne ?? ')
table ends
code segment
start:
mov ax, data ; ds指向data段
mov ds, ax
mov ax, table ; es指向table段
mov es, ax
mov bx, 0 ; 初始化各数据索引
mov si, 0
mov di, 0
mov cx, 5 ; 设置循环次数
s:
; 源数据的3个结构体分别是
; 年份 ds:0[si] 共4字节
; 总收入 ds:20[si] 共4字节
; 员工数 ds:40[di] 共2字节
;
; table数据的结构体为 es:[bx]
; 4个成员分别是
; 年份 es:[bx].0 或 es:0[bx]
; 总收入 es:[bx].5 或 es:5[bx]
; 员工数 es:[bx].10 或 es:10[bx]
; 平均收入 es:[bx].13 或 es:13[bx]
mov ax, 0[si] ; 复制年份
mov es:[bx].0[0], ax
mov ax, 0[si+2]
mov es:[bx].0[2], ax
mov ax, 20[si] ; 复制总收入
mov es:[bx].5[0], ax
mov dx, 20[si+2]
mov es:[bx].5[2], dx
mov ax, 40[di] ; 复制员工数
mov es:[bx].10, ax
; 被除数总收入为32字节,AX中为低16位,DX为高16位
; 除数员工数为16字节,结果中商放在AX,余数放在DX
; 把复制总收入的代码写在复制员工数代码的后面,可以
; 少些一条ax的赋值语句
mov ax, 20[si] ; 计算人均收入
div word ptr 40[di]
;div word ptr es:[bx].10
mov es:[bx].13, ax
add si, 4
add di, 2
add bx, 16
loop s
mov ax, 4c00H
int 21H
code ends
end start | | |
|