6YKT6ZKm5LqI 发表于 2022-6-23 10:03:55

一部分数据在data段没有显示

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

代码如下,查看data段发现只有年份,却看不到公司收入和雇员人数{:10_266:} :
;年份:0~53H 收入:54H~0A7H 雇员:0A8H~0D1H
assume cs:codesg, ds:data, es:table
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 sumn ne ?? ')
table ends

codesg segment
start:
    mov ax, data
    mov ds, ax
    mov ax, table ;因为这里ds已经被data占用
    mov es, ax
    mov bx, 0
    mov si, 0
    mov di, 0
    mov cx, 21 ;循环21次,写入21行信息

    s:mov al,
      mov es:, al
      mov al,
      mov es:, al
      mov al,
      mov es:, al
      mov al,
      mov es:, al
      ;实现存放4个字节的年份数据
      mov ax, 54h
      mov es:5h, ax
      mov ax, 56h
      mov es:7h, ax
      ;实现存放四个字节的公司总收入
      mov ax, 0A8h
      mov es:0Ah, ax
      ;实现存放字型的公司雇员人数
      mov ax, 54h
      mov dx, 57h
      div word ptr ds:0A8h
      mov es:0dh, ax
      ;实现计算并存放字型的平均收入
      add bx, 4 ;一个年份对应四个字节
      add si, 2 ;一个人数对应两个字节
      add di, 16 ;一行对应十六个字节
    loop s

    mov ax, 4c00h
    int 21h
codesg ends
end start

nikezhi 发表于 2022-6-23 13:26:59

我来领个币

6YKT6ZKm5LqI 发表于 2022-6-23 15:57:07

nikezhi 发表于 2022-6-23 13:26
我来领个币

哈哈哈哈{:10_256:}

涛4091 发表于 2022-6-23 16:12:13

全用db,可以吗

6YKT6ZKm5LqI 发表于 2022-6-23 17:26:12

涛4091 发表于 2022-6-23 16:12
全用db,可以吗

用db就是有点担心收入那里的数据存不下

jackz007 发表于 2022-6-23 22:05:49

本帖最后由 jackz007 于 2022-6-23 22:18 编辑

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

stack segment stack para 'stack'
    dw 400h dup(00)
stack ends

data segment para public 'data'
    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 para public 'table'
    db 21 dup ('year sumn ne ?? ')
table ends

code segment para public 'code'

main proc far
      mov ax, data
      mov ds, ax
      mov ax, table
      mov es, ax
      xor bx, bx
      push bx
      pop si
      push bx
      pop di
      mov cx, 21 ; 循环 21 次 ,写入 21 行信息
      cld
m1:   push cx
      push bx
      shl bx,1
      shl bx,1
      lea si,
      mov cx,4
      repe movsb
      inc di
      lea si,
      mov cx,4
      repe movsb
      inc di
      shr bx,1
      lea si,
      mov cx,2
      repe movsb
      add di,4
      pop bx
      inc bx
      pop cx
      loop m1
      mov ax, 4c00h
      int 21h
main endp
code ends
end main

6YKT6ZKm5LqI 发表于 2022-6-24 11:26:27

{:10_275:}
页: [1]
查看完整版本: 一部分数据在data段没有显示