鱼C论坛

 找回密码
 立即注册
查看: 1258|回复: 6

[已解决]一部分数据在data段没有显示

[复制链接]
发表于 2022-6-23 10:03:55 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 6YKT6ZKm5LqI 于 2022-6-23 10:58 编辑

代码如下,查看data段发现只有年份,却看不到公司收入和雇员人数
  1. ;年份:0~53H 收入:54H~0A7H 雇员:0A8H~0D1H
  2. assume cs:codesg, ds:data, es:table
  3. data segment
  4.     db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'
  5.     db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'
  6.     db '1993', '1994', '1995'
  7.     ;以上是表示21年的21个字符串
  8.     dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
  9.     dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
  10.     ;以上是21年公司总收入的21个dword型数据
  11.     dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
  12.     dw 11542, 14430, 15257, 17800
  13.     ;以上是21年公司雇员人数的21个word型数据
  14. data ends

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

  18. codesg segment
  19. start:
  20.     mov ax, data
  21.     mov ds, ax
  22.     mov ax, table ;因为这里ds已经被data占用
  23.     mov es, ax
  24.     mov bx, 0
  25.     mov si, 0
  26.     mov di, 0
  27.     mov cx, 21 ;循环21次,写入21行信息

  28.     s:  mov al, [bx]
  29.         mov es:[di], al
  30.         mov al, [bx + 1]
  31.         mov es:[di + 1], al
  32.         mov al, [bx + 2]
  33.         mov es:[di + 2], al
  34.         mov al, [bx + 3]
  35.         mov es:[di + 3], al
  36.         ;实现存放4个字节的年份数据
  37.         mov ax, 54h[bx]
  38.         mov es:5h[di], ax
  39.         mov ax, 56h[bx]
  40.         mov es:7h[di], ax
  41.         ;实现存放四个字节的公司总收入
  42.         mov ax, 0A8h[si]
  43.         mov es:0Ah[di], ax
  44.         ;实现存放字型的公司雇员人数
  45.         mov ax, 54h[bx]
  46.         mov dx, 57h[bx]
  47.         div word ptr ds:0A8h[si]
  48.         mov es:0dh[di], ax
  49.         ;实现计算并存放字型的平均收入
  50.         add bx, 4 ;一个年份对应四个字节
  51.         add si, 2 ;一个人数对应两个字节
  52.         add di, 16 ;一行对应十六个字节
  53.     loop s

  54.     mov ax, 4c00h
  55.     int 21h
  56. codesg ends
  57. end start
复制代码
最佳答案
2022-6-23 22:05:49
本帖最后由 jackz007 于 2022-6-23 22:18 编辑

        之所以只能看到年份,那是因为年份是字符串形式,在 debug 中可以直接被看到,而公司总收入和雇员人数是整型数,以十六进制字节的形式存在,我们不能直接看到其十进制数值。
        试试这个代码,循环结束的时候,看看从 ES:0 开始的内容
  1. assume cs:code , ds:data , es:table

  2. stack segment stack para 'stack'
  3.     dw 400h dup(00)
  4. stack ends

  5. data segment para public 'data'
  6.     db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'
  7.     db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'
  8.     db '1993', '1994', '1995'
  9.     ;以上是表示21年的21个字符串
  10.     dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
  11.     dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
  12.     ;以上是21年公司总收入的21个dword型数据
  13.     dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
  14.     dw 11542, 14430, 15257, 17800
  15.     ;以上是21年公司雇员人数的21个word型数据
  16. data ends

  17. table segment para public 'table'
  18.     db 21 dup ('year sumn ne ?? ')
  19. table ends

  20. code segment para public 'code'

  21. main proc far
  22.         mov ax, data
  23.         mov ds, ax
  24.         mov ax, table
  25.         mov es, ax
  26.         xor bx, bx
  27.         push bx
  28.         pop si
  29.         push bx
  30.         pop di
  31.         mov cx, 21 ; 循环 21 次 ,写入 21 行信息
  32.         cld
  33. m1:     push cx
  34.         push bx
  35.         shl bx,1
  36.         shl bx,1
  37.         lea si,[bx]
  38.         mov cx,4
  39.         repe movsb
  40.         inc di
  41.         lea si,[84 + bx]
  42.         mov cx,4
  43.         repe movsb
  44.         inc di
  45.         shr bx,1
  46.         lea si,[168 + bx]
  47.         mov cx,2
  48.         repe movsb
  49.         add di,4
  50.         pop bx
  51.         inc bx
  52.         pop cx
  53.         loop m1
  54.         mov ax, 4c00h
  55.         int 21h
  56. main endp
  57. code ends
  58. end main
复制代码

查看data段

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

使用道具 举报

发表于 2022-6-23 13:26:59 | 显示全部楼层

回帖奖励 +3 鱼币

我来领个币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-23 15:57:07 | 显示全部楼层

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

使用道具 举报

发表于 2022-6-23 16:12:13 | 显示全部楼层
全用db,可以吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-23 17:26:12 | 显示全部楼层

用db就是有点担心收入那里的数据存不下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-23 22:05:49 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-6-23 22:18 编辑

        之所以只能看到年份,那是因为年份是字符串形式,在 debug 中可以直接被看到,而公司总收入和雇员人数是整型数,以十六进制字节的形式存在,我们不能直接看到其十进制数值。
        试试这个代码,循环结束的时候,看看从 ES:0 开始的内容
  1. assume cs:code , ds:data , es:table

  2. stack segment stack para 'stack'
  3.     dw 400h dup(00)
  4. stack ends

  5. data segment para public 'data'
  6.     db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'
  7.     db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'
  8.     db '1993', '1994', '1995'
  9.     ;以上是表示21年的21个字符串
  10.     dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
  11.     dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
  12.     ;以上是21年公司总收入的21个dword型数据
  13.     dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
  14.     dw 11542, 14430, 15257, 17800
  15.     ;以上是21年公司雇员人数的21个word型数据
  16. data ends

  17. table segment para public 'table'
  18.     db 21 dup ('year sumn ne ?? ')
  19. table ends

  20. code segment para public 'code'

  21. main proc far
  22.         mov ax, data
  23.         mov ds, ax
  24.         mov ax, table
  25.         mov es, ax
  26.         xor bx, bx
  27.         push bx
  28.         pop si
  29.         push bx
  30.         pop di
  31.         mov cx, 21 ; 循环 21 次 ,写入 21 行信息
  32.         cld
  33. m1:     push cx
  34.         push bx
  35.         shl bx,1
  36.         shl bx,1
  37.         lea si,[bx]
  38.         mov cx,4
  39.         repe movsb
  40.         inc di
  41.         lea si,[84 + bx]
  42.         mov cx,4
  43.         repe movsb
  44.         inc di
  45.         shr bx,1
  46.         lea si,[168 + bx]
  47.         mov cx,2
  48.         repe movsb
  49.         add di,4
  50.         pop bx
  51.         inc bx
  52.         pop cx
  53.         loop m1
  54.         mov ax, 4c00h
  55.         int 21h
  56. main endp
  57. code ends
  58. end main
复制代码

评分

参与人数 1鱼币 +5 收起 理由
6YKT6ZKm5LqI + 5

查看全部评分

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

使用道具 举报

 楼主| 发表于 2022-6-24 11:26:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 01:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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