|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 lfjking 于 2016-7-4 15:39 编辑
以下是汇编代码 assume cs:code,ds:data,es:table,ss:stank
;原始数据段
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'
;收入 dword
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,2759000,3753000,4649000,5937000
;人数
dw 3,7,9,13,28,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
;目标数据段存放 es 中去
table segment
db 21 dup('year summ ne ?? ')
table ends
;栈段
stank segment
db 8 dup(0)
stank ends
;代码 功能 将 原始数据段的内容 按
;年份 + 空格 + 收入 + 空格 + 人数 + 空格 + 人均收入 + 空格 (0——F)格式写入table中
code segment
start:
;数据关联
mov dx,data
mov ds,dx
mov dx,table
mov es,dx
mov dx,stank
mov ss,dx
mov sp,8 ;栈顶初始化
;开始 将 数据 转移
mov si,0
mov di,0
mov ax,0
mov bx,0
mov dx,0
mov cx,21 ;每年所需 的 循环次数
year:push cx
;年份 双字 bh
mov dword ptr es:[bx],[di]
;空格 byte
mov byte ptr es:4[bx],' '
;收入 双字 bl 从 54H 开始
mov dword ptr es:5[bx],54H[di]
;保存 数值 用于 人均 计算
mov ax,es:5[bx]
mov dx,es:7[bx]
;空格 byte
mov byte ptr es:9[bx],' '
;人数 si 从 0A8H 字节 开始
mov word ptr es:0AH[bx],0A8H[si]
mov cx,0A8H[bx];保存 除数
;空格 byte
mov byte ptr es:0CH[bx],' '
;人均 需要 计算
div cx
mov es:0DH[bx],ax
;空格 byte
mov byte ptr es:0FH[bx],' '
add di,4
add si,2
add bx,0FH
pop cx
loop year
mov ax, 4c00H
int 21H
code ends
end start
masm 时 会出现 下图中的 错误
错误表述
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
跟帖的 兄弟已经 给出答案 至于 最后 的 关于 循环不出的问题
经过 我 debug 单步 检测 发现 是 收入 / 人数 这里 出错循环到 后面时 会出现 人数 获取到的值为 0 的 情况造成的
代码 无问题
是前面的数据部分 出问题的 我可能抄写数据部分 时 将 收入 和 人数 都 抄少了一年 所以 造成数据出错
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
下面 附上 修改后 正常 运行 的 正确代码assume cs:code,ds:data,es:table,ss:stank
;栈段
stank segment
db 16 dup(0)
stank ends
;原始数据段
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'
;收入 dword (之前的代码 少了 一年 数值 已在 末尾 加上)
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,2759000,3753000,4649000,5937000,7089000
;人数 (之前的代码 少了 一年 数值 已在 末尾 加上)
dw 3,7,9,13,28,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800,20100
data ends
;目标数据段存放 es 中去
table segment
db 21 dup('year summ ne ?? ')
table ends
;代码 功能 将 原始数据段的内容 按
;年份 + 空格 + 收入 + 空格 + 人数 + 空格 + 人均收入 + 空格 (0——F)格式写入table中
code segment
start:
;数据关联
mov dx,data
mov ds,dx
mov dx,table
mov es,dx
mov dx,stank
mov ss,dx
mov sp,16 ;栈顶初始化
;开始 将 数据 转移
mov si,0
mov di,0
mov ax,0
mov bx,0
mov dx,0
mov cx,21 ;每年所需 的 循环次数
s:push cx;保存循环计数
;年份 双字 bh
;因为 mov cx,[di] 是 Word 所以 这里的 赋值 只能分 两次 Word 来 赋值 下面的 Dword 类似
;mov dword ptr es:[bx],[di]
mov ax,[di]
mov es:[bx],ax
mov ax,2H[di]
mov es:2H[bx],ax
;空格 byte
mov byte ptr es:4[bx],' '
;收入 双字 bl 从 54H 开始
;mov dword ptr es:5[bx],54H[di] ;---------------------同上方注解---------------------------
;ax,dx 临时 保存 收入 数值 用于 人均 计算
mov ax,54H[di]
mov es:5H[bx],ax
mov dx,56H[di]
mov es:7H[bx],dx
;空格 byte
mov byte ptr es:9[bx],' '
;人数 si 从 0A8H 字节 开始
;cx 临时 保存 人数
mov cx,0A8H[si]
mov word ptr es:0AH[bx],cx
;空格 byte
mov byte ptr es:0CH[bx],' '
;人均 需要 计算
div cx
mov es:0DH[bx],ax
;空格 byte
mov byte ptr es:0FH[bx],' '
add di,4H
add si,2H
;(0-15) = (0H-0FH)
add bx,10H
;还原 循环计数
pop cx
loop s
mov ax, 4c00H
int 21H
code ends
end start
|
|