蔚蓝 发表于 2013-8-11 13:08:44

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



编译错误,求解

狂潮丶 发表于 2013-8-11 13:08:45

楼主,你好,请看看下面代码,看看你的错误在哪?

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

565123 发表于 2013-8-11 15:37:39

单引号,不是双引号

az4121 发表于 2013-8-12 09:53:34

0~83
84~167
另外,代码太短了,建议参考答案后重新写过
页: [1]
查看完整版本: 42课实验求解