实验7 为什么数据写不进去 求助
assume cs:codesgdata 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
开始年数正常 后面开始 输入的都是.. ....{:10_250:} 求求你们了 汇编吗,可怕。哥们你写汇编程序的时候不头疼吗{:10_256:} 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
div word ptr ds:
;这里的si应该是di 吧
mov es:,ax => mov es:,ax
xieglt 发表于 2020-8-24 17:13
这个好像是一个还有其他的赋的值就是显示不出来 显出书来是....... 就年份显示出来了 alingdu 发表于 2020-8-24 19:08
这个好像是一个还有其他的赋的值就是显示不出来 显出书来是....... 就年份显示出来了
你那些值是二进制数据,当然显示的是乱码,如果要显示出来,要转换成ASIIC码才行啊
这是程序运行后内存DUMP的结果,没有问题,如果要显示出来,就要转换成ASICC码显示。 本帖最后由 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 xieglt 发表于 2020-8-25 09:03
这是程序运行后内存DUMP的结果,没有问题,如果要显示出来,就要转换成ASICC码显示。
好的老哥 麻烦你了 谢谢{:5_109:} 感谢有你 ~
页:
[1]