马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 6YKT6ZKm5LqI 于 2022-6-23 10:58 编辑
代码如下,查看data段发现只有年份,却看不到公司收入和雇员人数 :
- ;年份: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, [bx]
- mov es:[di], al
- mov al, [bx + 1]
- mov es:[di + 1], al
- mov al, [bx + 2]
- mov es:[di + 2], al
- mov al, [bx + 3]
- mov es:[di + 3], al
- ;实现存放4个字节的年份数据
- mov ax, 54h[bx]
- mov es:5h[di], ax
- mov ax, 56h[bx]
- mov es:7h[di], ax
- ;实现存放四个字节的公司总收入
- mov ax, 0A8h[si]
- mov es:0Ah[di], ax
- ;实现存放字型的公司雇员人数
- mov ax, 54h[bx]
- mov dx, 57h[bx]
- div word ptr ds:0A8h[si]
- mov es:0dh[di], ax
- ;实现计算并存放字型的平均收入
- add bx, 4 ;一个年份对应四个字节
- add si, 2 ;一个人数对应两个字节
- add di, 16 ;一行对应十六个字节
- loop s
- mov ax, 4c00h
- int 21h
- codesg ends
- end start
复制代码
本帖最后由 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,[bx]
- mov cx,4
- repe movsb
- inc di
- lea si,[84 + bx]
- mov cx,4
- repe movsb
- inc di
- shr bx,1
- lea si,[168 + bx]
- 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
复制代码
|