鱼C论坛

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

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

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

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

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

x
  1. assume cs:codesg
  2. data segment
  3.         db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  4.         db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  5.         db '1993','1994','1995'
  6.        
  7.         dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  8.         dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  9.        
  10.         dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2558,2793,4037,5635,8226
  11.         dw 11542,14430,15257,17800
  12. data ends

  13. table segment
  14.        
  15.         db 21 dup ('year summ ne ?? ')
  16.        
  17. table ends

  18. codesg segment
  19.         stact:        mov ax,data
  20.                         mov ds,ax
  21.                         mov ax,table
  22.                         mov es,ax
  23.                        
  24.                         mov bx,0
  25.                         mov si,0
  26.                         mov di,0
  27.                         mov cx,21
  28.                        
  29.                 s:        mov al,[bx]
  30.                         mov es:[di],al
  31.                         mov al,[bx+1]
  32.                         mov es:[di+1],al
  33.                         mov al,[bx+2]
  34.                         mov es:[di+2],al
  35.                         mov al,[bx+3]
  36.                         mov es:[di+3],a
  37.                        
  38.                        
  39.                         mov ax,ds:[si+0A8h]
  40.                         mov es:[di+0Ah],ax
  41.                        
  42.                        
  43.                         mov ax,[bx+54h]
  44.                         mov dx,[bx+56h]
  45.                         mov es:[di+5],ax
  46.                         mov es:[di+7],dx
  47.                        
  48.                         div word ptr ds:[si+0A8h]
  49.                         mov es:[si+0dh],ax
  50.                        
  51.                         add di,10h
  52.                         add bx,4
  53.                         add si,2
  54.                 loop s
  55.                
  56.                 mov ax,4c00h
  57.                 int 21h
  58.                
  59.         codesg ends
  60.        
  61.         end stact
  62.                        
  63.                        
复制代码

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

1

1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-24 14:24:15 | 显示全部楼层
开始年数正常 后面开始 输入的都是.. ..  .. 求求你们了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 15:41:51 | 显示全部楼层
汇编吗,可怕。哥们你写汇编程序的时候不头疼吗
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 17:13:20 | 显示全部楼层
  1.                         
  2. div word ptr ds:[si+0A8h]
  3. ;这里的si应该是di 吧
  4. mov es:[si+0dh],ax           => mov es:[di+0dh],ax

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个好像是一个还有其他的  赋的值就是显示不出来 显出书来是....... 就年份显示出来了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你那些值是二进制数据,当然显示的是乱码,如果要显示出来,要转换成ASIIC码才行啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

  1. .MODEL SMALL  

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

  7. _start:
  8.         MOV   AX,data
  9.         MOV   DS,AX
  10.        
  11.         ;传参数_ascii地址
  12.         XOR   AX,AX
  13.         PUSH  AX
  14.         ;传参数0ABCDH
  15.         MOV   AX,0ABCDH
  16.         PUSH  AX
  17.         ;call _Hex2Ascii(0ABCDH,_ascii)
  18.         ;将0ABCDH从二进制数转换为ASCII码保存进_ascii中       
  19.         CALL  _Hex2Ascii
  20.        
  21.         ;调用DOS功能输出字符串_ascii
  22.         MOV   AH,9
  23.         XOR   DX,DX
  24.         INT   21H
  25.        
  26.         ;传参数_decimal地址
  27.         MOV   AX,OFFSET _decimal
  28.         SUB   AX,OFFSET _ascii
  29.         PUSH  AX
  30.         ;传参数0DCBAH
  31.         MOV   AX,0DCBAH
  32.         PUSH  AX
  33.         ;call _Hex2Ascii(0DCBAH,_decimal)
  34.         ;将0DCBAH从二进制数转换为十进制ASCII码保存进_decimal中               
  35.         CALL  _Hex2Decimal
  36.        
  37.         ;调用DOS功能输出字符串_decimal
  38.         MOV   AH,9
  39.         MOV   DX,OFFSET _decimal
  40.         SUB   DX,OFFSET _ascii
  41.         INT   21H

  42.         MOV   AX,4C00H
  43.         INT   21H
  44.        
  45. ;***************************************************************
  46. ;   函数名: _Hex2Ascii(number,buffer)
  47. ;   功  能: 将一个16位的二进制数转化位ASCII码,保存在buffer中
  48. ;   参  数: number : 16位二进制数
  49. ;            buffer : 用于存储ASCII码的内存地址
  50. ;   返回值: 无
  51. ;   其  他: 参数传递方式:先右后左
  52. ;            调用方式:段内调用
  53. ;            堆栈调整:函数内调整
  54. ;***************************************************************
  55. _Hex2Ascii PROC
  56.         PUSH  BP
  57.         MOV   BP,SP
  58.         PUSH  ES
  59.         PUSH  DI
  60.         PUSH  AX
  61.         PUSH  CX
  62.        
  63.         ;ES:DI 存储转化结果
  64.         PUSH  DS
  65.         POP   ES
  66.        
  67.         ;取参数number
  68.         MOV   AX,[BP + 4]
  69.         ;取参数buffer
  70.         MOV   DI,[BP + 6]
  71.         ;数在内存里的存储方式位低低高高
  72.         ;如0ABCDH,在内存里是 CD AB
  73.         ;转换成人类习惯的阅读方式需要反过来
  74.         ;即先从低位转化,把低位放置在内存高位
  75.         ADD   DI,3
  76.        
  77.         ;设置 DI 指针自减
  78.         STD
  79.         ;每4位一个ASCII码
  80.         MOV   CL,4
  81. _AsciiNotOver:
  82.         PUSH  AX
  83.         ;转化成ASCII码
  84.         CALL  _H2A
  85.         ;存储
  86.         STOSB
  87.         POP   AX
  88.         SHR   AX,CL
  89.         TEST  AX,AX
  90.         JNZ   _AsciiNotOver
  91.         CLD
  92.                        
  93.         POP   CX
  94.         POP   AX
  95.         POP   DI
  96.         POP   ES
  97.         MOV   SP,BP
  98.         POP          BP
  99.         RET   4
  100. _Hex2Ascii ENDP

  101. ;***************************************************************
  102. ;   函数名: _Hex2Decimal(number,buffer)
  103. ;   功  能: 将一个16位的二进制数转化位十进制ASCII码,保存在buffer中
  104. ;   参  数: number : 16位二进制数
  105. ;            buffer : 用于存储十进制ASCII码的内存地址
  106. ;   返回值: 无
  107. ;   其  他: 参数传递方式:先右后左
  108. ;            调用方式:段内调用
  109. ;            堆栈调整:函数内调整
  110. ;***************************************************************
  111. _Hex2Decimal PROC
  112.         PUSH  BP
  113.         MOV   BP,SP
  114.         PUSH  ES
  115.         PUSH  DI
  116.         PUSH  AX
  117.         PUSH  CX
  118.         PUSH  DX
  119.        
  120.         PUSH  DS
  121.         POP   ES
  122.        
  123.         MOV   AX,[BP + 4]
  124.         MOV   DI,[BP + 6]
  125.         ADD   DI,4
  126.        
  127.         STD
  128.         MOV   CX,0AH
  129. _DecimalNotOver:
  130.         ;DX:AX / 10
  131.         ;商=>AX,余数=>DX,将余数转化成ASCII码
  132.         XOR   DX,DX
  133.         DIV   CX
  134.         XCHG  AX,DX
  135.         CALL  _H2A
  136.         STOSB
  137.         XCHG  AX,DX
  138.         TEST  AX,AX
  139.         JNZ   _DecimalNotOver
  140.        
  141.         CLD
  142.         POP   DX
  143.         POP   CX
  144.         POP   AX
  145.         POP   DI
  146.         POP   ES
  147.         MOV   SP,BP
  148.         POP          BP       
  149.         RET   4
  150. _Hex2Decimal ENDP

  151. _H2A PROC
  152.         AND   AL,0FH
  153.         ADD          AL,030H
  154.         CMP   AL,039H
  155.         JLE   _IsDec
  156.         ADD   AL,7
  157. _IsDec:
  158.         RET
  159. _H2A ENDP

  160. END _start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的老哥 麻烦你了 谢谢   感谢有你   ~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 18:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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