lfjking 发表于 2016-7-4 09:08:30

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

本帖最后由 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:,
       
        ;空格 byte
        mov byte ptr es:4,' '
       
        ;收入 双字 bl从 54H 开始
        mov dword ptr es:5,54H
        ;保存 数值 用于 人均 计算
        mov ax,es:5
        mov dx,es:7
       
        ;空格 byte
        mov byte ptr es:9,' '
       
        ;人数 si从 0A8H 字节 开始
        mov word ptr es:0AH,0A8H
        mov cx,0A8H;保存 除数
       
        ;空格 byte
        mov byte ptr es:0CH,' '
       
        ;人均 需要 计算
        div cx
        mov es:0DH,ax
        ;空格 byte
        mov byte ptr es:0FH,' '       
       
        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, 是 Word 所以 这里的 赋值 只能分 两次 Word 来 赋值 下面的 Dword 类似
                ;mov dword ptr es:,
                mov ax,
                mov es:,ax
                mov ax,2H
                mov es:2H,ax
               
                ;空格 byte
                mov byte ptr es:4,' '
               
                ;收入 双字 bl从 54H 开始
                ;mov dword ptr es:5,54H        ;---------------------同上方注解---------------------------
                ;ax,dx 临时 保存 收入 数值 用于 人均 计算
                mov ax,54H
                mov es:5H,ax
                mov dx,56H
                mov es:7H,dx
               
                ;空格 byte
                mov byte ptr es:9,' '
               
                ;人数 si从 0A8H 字节 开始
                ;cx 临时 保存 人数
                mov cx,0A8H
                mov word ptr es:0AH,cx
               
                ;空格 byte
                mov byte ptr es:0CH,' '
               
                ;人均 需要 计算
                div cx
                mov es:0DH,ax
                ;空格 byte
                mov byte ptr es:0FH,' '       
               
                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

zzzz76 发表于 2016-7-4 11:13:34

本帖最后由 zzzz76 于 2016-7-4 11:15 编辑

将48, 54, 63 都分开写,例如mov dword ptr es:,分开来写成        mov ax, mov es:, ax        mov ax, 2        mov es:2, ax并不知道你那种表达为何不可以,但似乎并不规范

lfjking 发表于 2016-7-4 11:56:57

zzzz76 发表于 2016-7-4 11:13
将48, 54, 63 都分开写,例如mov dword ptr es:,分开来写成        mov ax, mov es:, ax        mov ax, 2[ ...

谢谢{:5_93:}

lfjking 发表于 2016-7-4 13:51:46

zzzz76 发表于 2016-7-4 11:13
将48, 54, 63 都分开写,例如mov dword ptr es:,分开来写成        mov ax, mov es:, ax        mov ax, 2[ ...

谢谢 上楼的 解答
给出 修改后的 代码(其他不变) 但是 还有问题 就是 循环 莫名 出不来。。。蛋疼的紧啊
        mov cx,21 ;每年所需 的 循环次数
        s:push cx;保存循环计数
                ;年份 双字 bh
                ;因为 mov cx, 是 Word 所以 这里的 赋值 只能分 两次 Word 来 赋值 下面的 Dword 类似
                ;mov dword ptr es:,
                mov ax,
                mov es:,ax
                mov ax,2
                mov es:2,ax
               
                ;空格 byte
                mov byte ptr es:4,' '
               
                ;收入 双字 bl从 54H 开始
                ;mov dword ptr es:5,54H        ;---------------------同上方注解---------------------------
                ;ax,dx 临时 保存 收入 数值 用于 人均 计算
                mov ax,54H
                mov es:5,ax
                mov dx,56H
                mov es:7,dx
               
                ;空格 byte
                mov byte ptr es:9,' '
               
                ;人数 si从 0A8H 字节 开始
                ;cx 临时 保存 人数
                mov cx,0A8H
                mov word ptr es:0AH,cx
               
                ;空格 byte
                mov byte ptr es:0CH,' '
               
                ;人均 需要 计算
                div cx
                mov es:0DH,ax
                ;空格 byte
                mov byte ptr es:0FH,' '       
               
                add di,4
                add si,2
                ;(0-15) = (0H-0FH)
                add bx,10H
        ;还原 循环计数
        pop cx
        loop s
页: [1]
查看完整版本: 【零基础汇编】实验7问题求解决