|
主题 : : 第8章 试验7实现代码 [待解决] |
回复[ 9次 ]
点击[ 407次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2013-05-05 21:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-02 12:37 |
assume cs:code, ds:data, es:table
data segment
db '1975', '1976', '1977', '1978', '1979', '1980', '1981'
db '1982', '1983', '1984', '1985', '1986', '1987', '1988'
db '1989', '1990', '1991', '1992', '1993', '1994', '1995'
dd 16, 22, 382, 1356, 2390, 8000, 16000
dd 24486, 50065, 97479, 140417, 197514, 345980, 590827
dd 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
dw 3, 7, 9, 13, 28, 38, 130
dw 220, 476, 778, 1001, 1442, 2258, 2793
dw 4037, 5635, 8226, 11542, 14430, 15257, 17800
data ends
table segment
db 21 dup ('year summ ne ?? ');
table ends
code segment
start:
mov ax, data ; 使ds指向data
mov ds, ax
mov ax, table ; 使es指向table
mov es, ax
sub bx, bx ; 把data段看做数组
; 令bx为数组下标
sub di, di ; 把table段看做结构
; 令di为结构基地址
mov cx, 21 ; 设定循环次数
again:
mov si, bx ; 下标bx乘以2后存入si
add si, si
mov ax, ds:[si] ; 存入年份
mov dx, ds:[si + 02h]
mov es:[di], ax
mov es:[di + 02h], dx
mov ax, ds:[054h + si] ; ax为收入的低16位
mov dx, ds:[054h + si + 02h] ; dx为收入的高16位
mov es:[di + 05h], ax ; 存入收入
mov es:[di + 05h + 02h], dx
mov bp, ds:[0a8h + bx] ; 存入雇员数
mov es:[di + 0ah], bp
div bp ; 除以雇员数得到平均工资
mov es:[di + 0dh], ax ; 存入平均工资
add bx, 02h ; 继续处理下一组数据
add di, 010h
loop again
mov ax, 4c00h ; 程序退出
int 21h
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2013-05-05 21:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-02 12:37 |
|
|
|
|
|
[第2楼]
[ 回复时间:2013-05-05 21:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-02 12:37 |
assume cs:code, ds:data, es:table
data segment
db '1975', '1976', '1977', '1978', '1979', '1980', '1981'
db '1982', '1983', '1984', '1985', '1986', '1987', '1988'
db '1989', '1990', '1991', '1992', '1993', '1994', '1995'
dd 16, 22, 382, 1356, 2390, 8000, 16000
dd 24486, 50065, 97479, 140417, 197514, 345980, 590827
dd 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
dw 3, 7, 9, 13, 28, 38, 130
dw 220, 476, 778, 1001, 1442, 2258, 2793
dw 4037, 5635, 8226, 11542, 14430, 15257, 17800
data ends
table segment
db 21 dup ('year summ ne ?? ');
table ends
code segment
start:
mov ax, data ; 使ds指向data
mov ds, ax
mov ax, table ; 使es指向table
mov es, ax
sub bx, bx ; 把data段看做数组
; 令bx为数组下标
sub di, di ; 把table段看做结构
; 令di为结构基地址
mov cx, 21 ; 设定循环次数
again:
mov si, bx ; 下标bx乘以2后存入si
add si, si
mov ax, ds:[si].0 ; 存入年份
mov dx, ds:[si].2
mov es:[di].0, ax
mov es:[di].2, dx
mov ax, ds:054h.[si].0 ; ax为收入的低16位
mov dx, ds:054h.[si].2 ; dx为收入的高16位
mov es:[di].5, ax ; 存入收入
mov es:[di].7, dx
mov bp, ds:0a8h.[bx] ; 存入雇员数
mov es:[di].0ah, bp
div bp ; 除以雇员数得到平均工资
mov es:[di].0dh, ax ; 存入平均工资
add bx, 02h ; 继续处理下一组数据
add di, 010h
loop again
mov ax, 4c00h ; 程序退出
int 21h
code ends
end start | | |
|
|
|
|
[第3楼]
[ 回复时间:2013-05-08 21:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-04-24 15:23 |
想问一下,我不知道在debug里怎么执行和查看,不知道用什么命令让他执行,能不能截图帮我一下,谢谢啦 | | |
|
|
|
|
[第4楼]
[ 回复时间:2013-05-10 11:34 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-02 12:37 |
|
|
|
|
|
[第5楼]
[ 回复时间:2013-05-11 08:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06 |
|
|
|
|
|
[第6楼]
[ 回复时间:2013-05-11 11:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-02 12:37 |
空格已经在table段中,难道还需要再输入一次?(不需要输入!!!) | | |
|
|
|
|
[第7楼]
[ 回复时间:2013-05-13 08:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06 |
回复:[第6楼]
------------------
没注意 所以多写了一堆-.- .........
.........................-.- 不是 ,, 原来是定义错了, table段少定义2个空格, 所以导致显示的时候 全错了 | | |
|
|
|
|
[第8楼]
[ 回复时间:2013-05-13 08:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06 |
我在努力缩减 要执行的机器码次数 ,, -.- 就是你那个 要运行48行 才能运行到int 21H
我已经把原来的不是数组源码从60几行缩到56 -.- 52行了.... 现在要重新想下数组的 | | |
|
|
|
|
[第9楼]
[ 回复时间:2013-05-13 10:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:424
信誉值:0
注册日期:2013-04-08 10:06 |
好像差不多.....................
assume cs:codesg ; 机器指令48行 cx=27A
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983' ;1个年份占4字节
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995';以上表示21年的21个字符串 ;data:53 84个字节
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 ;1个数据占4字节
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上表示21年公司总收入的21个dword型数据 ;data:A7 ;21*4(84)+84=168个字节单元
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
dw 11542, 14430, 15257, 17800 ;1个数据占2个字节
;以上表示21年公司雇员人数的21个word型数据 ;data:D1 ;168+21*2(42)=210个字节单元
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
sub bx,bx
sub si,si
sub di,di
mov cx,21
s: ;年份
mov ax,[si].0
mov es:[bx].0,ax
mov ax,[si].2
mov es:[bx].2,ax
;收入
mov ax,[si].84
mov es:[bx].05H,ax
mov dx,[si].86
mov es:[bx].07H,dx
;雇员
mov bp,[di].168
mov es:[bx].0AH,bp
;平均收入
div bp
mov es:[bx].0dH,ax
add bx,10h
add si,4
inc di
inc di
loop s
mov ax,4c00h
int 21h
codesg ends
end start | | |
|