|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
复制代码 |
|