鱼C论坛

 找回密码
 立即注册
查看: 3066|回复: 9

[已解决]实验7 为什么数据写不进去 求助

[复制链接]
发表于 2020-8-24 14:23:15 | 显示全部楼层 |阅读模式

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

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

x
assume cs:codesg
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'
        
        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
        
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2558,2793,4037,5635,8226
        dw 11542,14430,15257,17800
data ends

table segment
        
        db 21 dup ('year summ ne ?? ')
        
table ends

codesg segment
        stact:        mov ax,data
                        mov ds,ax
                        mov ax,table
                        mov es,ax
                        
                        mov bx,0
                        mov si,0
                        mov di,0
                        mov cx,21
                        
                s:        mov al,[bx]
                        mov es:[di],al
                        mov al,[bx+1]
                        mov es:[di+1],al
                        mov al,[bx+2]
                        mov es:[di+2],al
                        mov al,[bx+3]
                        mov es:[di+3],a
                        
                        
                        mov ax,ds:[si+0A8h]
                        mov es:[di+0Ah],ax
                        
                        
                        mov ax,[bx+54h]
                        mov dx,[bx+56h]
                        mov es:[di+5],ax
                        mov es:[di+7],dx
                        
                        div word ptr ds:[si+0A8h]
                        mov es:[si+0dh],ax
                        
                        add di,10h
                        add bx,4
                        add si,2
                loop s
                
                mov ax,4c00h
                int 21h
                
        codesg ends
        
        end stact
                        
                        
最佳答案
2020-8-25 09:03:20
ABCD.JPG
这是程序运行后内存DUMP的结果,没有问题,如果要显示出来,就要转换成ASICC码显示。

1

1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-24 14:24:15 | 显示全部楼层
开始年数正常 后面开始 输入的都是.. ..  .. 求求你们了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 15:41:51 | 显示全部楼层
汇编吗,可怕。哥们你写汇编程序的时候不头疼吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 17:11:15 | 显示全部楼层
assume cs:codesg
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'
;以上是表示21年的21个字符

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword型数据

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人员人数的21个word型数据
data ends

table segment
db 21 dup('year summ ne ?? ')
table ends

codesg segment
start: mov ax,data
mov ds,ax

mov ax,table
mov es,ax
mov bx,0                ;定义ds段第一组及第二组数据的元素
mov si,0       ;定位ds数据段第三组中的元素

mov di,0       ;定位es数据段es:di





mov cx,21

s: mov ax,ds:[bx]
mov es:[di],ax
mov ax,ds:[bx+2]
mov es:[di+2],ax

mov ax,ds:[si+168]
mov es:[di+0ah],ax



mov ax,ds:[bx+84]
mov es:[di+5],ax
mov dx,ds:[bx+84+2]
mov es:[di+5+2],dx

div word ptr es:[di+0ah]
mov es:[di+0Dh],ax


add bx,4
add si,2
add di,10H

loop s

mov ax,4c00h
int 21h

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

使用道具 举报

发表于 2020-8-24 17:13:20 | 显示全部楼层
                        
div word ptr ds:[si+0A8h]
;这里的si应该是di 吧
mov es:[si+0dh],ax           => mov es:[di+0dh],ax 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 19:08:18 | 显示全部楼层

这个好像是一个还有其他的  赋的值就是显示不出来 显出书来是....... 就年份显示出来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 08:40:38 | 显示全部楼层
alingdu 发表于 2020-8-24 19:08
这个好像是一个还有其他的  赋的值就是显示不出来 显出书来是....... 就年份显示出来了

你那些值是二进制数据,当然显示的是乱码,如果要显示出来,要转换成ASIIC码才行啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 09:03:20 | 显示全部楼层    本楼为最佳答案   
ABCD.JPG
这是程序运行后内存DUMP的结果,没有问题,如果要显示出来,就要转换成ASICC码显示。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
alingdu + 5 + 5 + 3

查看全部评分

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

使用道具 举报

发表于 2020-8-25 11:04:46 | 显示全部楼层
本帖最后由 xieglt 于 2020-8-25 11:10 编辑

[b]给你一段二进制数转化成ASCII码的代码[/b]
.MODEL SMALL  

data segment
        _ascii DB 4 DUP(0),0AH,0DH,024H
        _decimal DB 5 DUP(0),0AH,0DH,024H
data ends
.CODE

_start:
        MOV   AX,data
        MOV   DS,AX
        
        ;传参数_ascii地址
        XOR   AX,AX
        PUSH  AX
        ;传参数0ABCDH
        MOV   AX,0ABCDH
        PUSH  AX
        ;call _Hex2Ascii(0ABCDH,_ascii)
        ;将0ABCDH从二进制数转换为ASCII码保存进_ascii中        
        CALL  _Hex2Ascii
        
        ;调用DOS功能输出字符串_ascii
        MOV   AH,9
        XOR   DX,DX
        INT   21H
        
        ;传参数_decimal地址
        MOV   AX,OFFSET _decimal
        SUB   AX,OFFSET _ascii
        PUSH  AX
        ;传参数0DCBAH
        MOV   AX,0DCBAH
        PUSH  AX
        ;call _Hex2Ascii(0DCBAH,_decimal)
        ;将0DCBAH从二进制数转换为十进制ASCII码保存进_decimal中                
        CALL  _Hex2Decimal
        
        ;调用DOS功能输出字符串_decimal
        MOV   AH,9
        MOV   DX,OFFSET _decimal
        SUB   DX,OFFSET _ascii
        INT   21H

        MOV   AX,4C00H
        INT   21H
        
;***************************************************************
;   函数名: _Hex2Ascii(number,buffer)
;   功  能: 将一个16位的二进制数转化位ASCII码,保存在buffer中
;   参  数: number : 16位二进制数
;            buffer : 用于存储ASCII码的内存地址
;   返回值: 无
;   其  他: 参数传递方式:先右后左
;            调用方式:段内调用
;            堆栈调整:函数内调整
;***************************************************************
_Hex2Ascii PROC
        PUSH  BP
        MOV   BP,SP
        PUSH  ES
        PUSH  DI
        PUSH  AX
        PUSH  CX
        
        ;ES:DI 存储转化结果
        PUSH  DS
        POP   ES
        
        ;取参数number
        MOV   AX,[BP + 4]
        ;取参数buffer
        MOV   DI,[BP + 6]
        ;数在内存里的存储方式位低低高高
        ;如0ABCDH,在内存里是 CD AB
        ;转换成人类习惯的阅读方式需要反过来
        ;即先从低位转化,把低位放置在内存高位
        ADD   DI,3
        
        ;设置 DI 指针自减
        STD
        ;每4位一个ASCII码
        MOV   CL,4
_AsciiNotOver:
        PUSH  AX
        ;转化成ASCII码
        CALL  _H2A
        ;存储
        STOSB
        POP   AX
        SHR   AX,CL
        TEST  AX,AX
        JNZ   _AsciiNotOver
        CLD
                        
        POP   CX
        POP   AX
        POP   DI
        POP   ES
        MOV   SP,BP
        POP          BP
        RET   4
_Hex2Ascii ENDP

;***************************************************************
;   函数名: _Hex2Decimal(number,buffer)
;   功  能: 将一个16位的二进制数转化位十进制ASCII码,保存在buffer中
;   参  数: number : 16位二进制数
;            buffer : 用于存储十进制ASCII码的内存地址
;   返回值: 无
;   其  他: 参数传递方式:先右后左
;            调用方式:段内调用
;            堆栈调整:函数内调整
;***************************************************************
_Hex2Decimal PROC
        PUSH  BP
        MOV   BP,SP
        PUSH  ES
        PUSH  DI
        PUSH  AX
        PUSH  CX
        PUSH  DX
        
        PUSH  DS
        POP   ES
        
        MOV   AX,[BP + 4]
        MOV   DI,[BP + 6]
        ADD   DI,4
        
        STD
        MOV   CX,0AH
_DecimalNotOver:
        ;DX:AX / 10
        ;商=>AX,余数=>DX,将余数转化成ASCII码
        XOR   DX,DX
        DIV   CX
        XCHG  AX,DX
        CALL  _H2A
        STOSB
        XCHG  AX,DX
        TEST  AX,AX
        JNZ   _DecimalNotOver
        
        CLD
        POP   DX
        POP   CX
        POP   AX
        POP   DI
        POP   ES
        MOV   SP,BP
        POP          BP        
        RET   4
_Hex2Decimal ENDP

_H2A PROC
        AND   AL,0FH
        ADD          AL,030H
        CMP   AL,039H
        JLE   _IsDec
        ADD   AL,7
_IsDec:
        RET
_H2A ENDP

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

使用道具 举报

 楼主| 发表于 2020-8-25 16:07:38 | 显示全部楼层
xieglt 发表于 2020-8-25 09:03
这是程序运行后内存DUMP的结果,没有问题,如果要显示出来,就要转换成ASICC码显示。

好的老哥 麻烦你了 谢谢   感谢有你   ~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-29 04:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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