42课实验求解
assume cs:code,ds:data,es:table;============================================数据段======================================================================
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
;以上表示21年的21个字符串0-83
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型数据84-138
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,144430,15257,17800
;以上表示21年公司雇员人数的21个word型数据 139-180
data ends
;======================================================================================================================
table segment
db 21 dup('xiaoqinhai123456')
table ends
;==============================================代码段=====================================================================
code segment
start:
mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov cx,21
mov bp,0
mov bx,0
mov si,84
mov di,139
xh1:
mov dword ptr es:,
mov byte ptr es:.4,"*"
mov dword ptr es:.5,
mov byte ptr es:.9,"*"
mov word ptr es:.10,
mov byte ptr es:.12,"####"
add bp,16
add bx,4
add si,4
add di,2
loop xh1
mov ax,4c00H
int 21H
code ends
end start
编译错误,求解
楼主,你好,请看看下面代码,看看你的错误在哪?
table复制21行“year sumn ne ??”然后用date段中的年份 收入雇员覆盖
比如第一行覆盖的格式是1975 (16 00 00 00) (03 00) 平均收入
(= =括号中的00是字节和table中的对应)
codesg segment
start:
mov ax, data 注释利用AX间接给ds赋值
mov ds, ax =同上
mov ax, table =同上
mov es, ax =同上
=这四条找复制段的地址
mov cx, 21 =循环21次打印21行year sumn ne ?? 格式的行
mov bx, 0 ; 年份的首地址 =date段年份偏移地址
mov si, 54H ; 收入的首地址 =收入的偏移地址 单引号定义的字符串每个字符占一个字节,所以21*4=84=54H
=因为从0开始计数,所以54H是年分段的地址,(段:段偏移)可以找到相应数据
mov di, 0a8H ; 雇员数的首地址 =date段的雇员数偏移地址,和上面算法一样
mov bp, 0 ; table的基址
s:
mov ax, =获取ds:的值放到ES:中
mov es:, ax =同上 ax两字节 每个年份但上面定义的是4字节
mov ax, 2 =在吧年份的另外两字节放进去
mov es:2, ax =同上
; 年份
mov ax, =又上可知si放的是收入地址
mov es:5, ax =同样把收入覆盖,es5=es:
mov ax, 2 =
mov es:7, ax =收入双字覆盖两次
; 收入
mov ax, =同上,获取雇员数偏移,然后覆盖数据
mov es:0aH, ax
; 雇员
mov ax, =下面是除法了,不用解释了吧
mov dx, 2
div word ptr
mov es:0dH, ax
; 人均收入
add bx, 4 =bx年份四字节
add si, 4 =si收入四字节(双字)
add di, 2 =di收入一字
add bp, 10H =“year summ ne ?? ”十六字节10H 下一行偏移,开始打印
loop s
mov ax, 4c00H
int 21H
codesg ends
end start
单引号,不是双引号 0~83
84~167
另外,代码太短了,建议参考答案后重新写过
页:
[1]