alingdu 发表于 2020-8-24 14:23:15

实验7 为什么数据写不进去 求助

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,
                        mov es:,al
                        mov al,
                        mov es:,al
                        mov al,
                        mov es:,al
                        mov al,
                        mov es:,a
                       
                       
                        mov ax,ds:
                        mov es:,ax
                       
                       
                        mov ax,
                        mov dx,
                        mov es:,ax
                        mov es:,dx
                       
                        div word ptr ds:
                        mov es:,ax
                       
                        add di,10h
                        add bx,4
                        add si,2
                loop s
               
                mov ax,4c00h
                int 21h
               
        codesg ends
       
        end stact
                       
                       

alingdu 发表于 2020-8-24 14:24:15

开始年数正常 后面开始 输入的都是.. ....{:10_250:} 求求你们了

君子好逑 发表于 2020-8-24 15:41:51

汇编吗,可怕。哥们你写汇编程序的时候不头疼吗{:10_256:}

sbx 发表于 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:
mov es:,ax
mov ax,ds:
mov es:,ax

mov ax,ds:
mov es:,ax



mov ax,ds:
mov es:,ax
mov dx,ds:
mov es:,dx

div word ptr es:
mov es:,ax


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

loop s

mov ax,4c00h
int 21h

codesg ends
end start

xieglt 发表于 2020-8-24 17:13:20

                        
div word ptr ds:
;这里的si应该是di 吧
mov es:,ax         => mov es:,ax

alingdu 发表于 2020-8-24 19:08:18

xieglt 发表于 2020-8-24 17:13


这个好像是一个还有其他的赋的值就是显示不出来 显出书来是....... 就年份显示出来了

xieglt 发表于 2020-8-25 08:40:38

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

你那些值是二进制数据,当然显示的是乱码,如果要显示出来,要转换成ASIIC码才行啊

xieglt 发表于 2020-8-25 09:03:20


这是程序运行后内存DUMP的结果,没有问题,如果要显示出来,就要转换成ASICC码显示。

xieglt 发表于 2020-8-25 11:04:46

本帖最后由 xieglt 于 2020-8-25 11:10 编辑

给你一段二进制数转化成ASCII码的代码

.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
        PUSHAX
        ;传参数0ABCDH
        MOV   AX,0ABCDH
        PUSHAX
        ;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
        PUSHAX
        ;传参数0DCBAH
        MOV   AX,0DCBAH
        PUSHAX
        ;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
        PUSHBP
        MOV   BP,SP
        PUSHES
        PUSHDI
        PUSHAX
        PUSHCX
       
        ;ES:DI 存储转化结果
        PUSHDS
        POP   ES
       
        ;取参数number
        MOV   AX,
        ;取参数buffer
        MOV   DI,
        ;数在内存里的存储方式位低低高高
        ;如0ABCDH,在内存里是 CD AB
        ;转换成人类习惯的阅读方式需要反过来
        ;即先从低位转化,把低位放置在内存高位
        ADD   DI,3
       
        ;设置 DI 指针自减
        STD
        ;每4位一个ASCII码
        MOV   CL,4
_AsciiNotOver:
        PUSHAX
        ;转化成ASCII码
        CALL_H2A
        ;存储
        STOSB
        POP   AX
        SHR   AX,CL
        TESTAX,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
        PUSHBP
        MOV   BP,SP
        PUSHES
        PUSHDI
        PUSHAX
        PUSHCX
        PUSHDX
       
        PUSHDS
        POP   ES
       
        MOV   AX,
        MOV   DI,
        ADD   DI,4
       
        STD
        MOV   CX,0AH
_DecimalNotOver:
        ;DX:AX / 10
        ;商=>AX,余数=>DX,将余数转化成ASCII码
        XOR   DX,DX
        DIV   CX
        XCHGAX,DX
        CALL_H2A
        STOSB
        XCHGAX,DX
        TESTAX,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

alingdu 发表于 2020-8-25 16:07:38

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

好的老哥 麻烦你了 谢谢{:5_109:} 感谢有你   ~
页: [1]
查看完整版本: 实验7 为什么数据写不进去 求助