鱼C论坛

 找回密码
 立即注册
查看: 2005|回复: 3

【零基础汇编】实验7问题求解决

[复制链接]
发表于 2016-7-4 09:08:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-4 11:13:34 | 显示全部楼层
本帖最后由 zzzz76 于 2016-7-4 11:15 编辑

将48, 54, 63 都分开写,例如  mov dword ptr es:[bx],[di]分开来写成        mov ax, [di]  mov es:[bx], ax        mov ax, 2[di]        mov es:2[bx], ax  并不知道你那种表达为何不可以,但似乎并不规范
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-7-4 11:56:57 | 显示全部楼层
zzzz76 发表于 2016-7-4 11:13
将48, 54, 63 都分开写,例如  mov dword ptr es:,[di]分开来写成        mov ax, [di]  mov es:, ax        mov ax, 2[ ...

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

使用道具 举报

 楼主| 发表于 2016-7-4 13:51:46 | 显示全部楼层
zzzz76 发表于 2016-7-4 11:13
将48, 54, 63 都分开写,例如  mov dword ptr es:,[di]分开来写成        mov ax, [di]  mov es:, ax        mov ax, 2[ ...

谢谢 上楼的 解答
给出 修改后的 代码(其他不变) 但是 还有问题 就是 循环 莫名 出不来。。。蛋疼的紧啊
        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,2[di]
                mov es:2[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:5[bx],ax
                mov dx,56H[di]
                mov es:7[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,4
                add si,2
                ;(0-15) = (0H-0FH)
                add bx,10H 
        ;还原 循环计数
        pop cx
        loop s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 11:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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