. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->更灵活的定位内存地址的方法
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验七 没有用到所有寻址方式和所学的所有知识。有请的更好的代码。谢谢指正!!!  [待解决] 回复[ 10次 ]   点击[ 818次 ]  
linuxembedded
[帖 主]   [ 发表时间:2007-10-11 15:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2007-10-08 10:36
assume cs:code

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"

        dd 16,22,382,1356,2369,8000,16000,24486,50065,97479,140417,197514
        dd 345980,590872,803530,1183000,1843000,2759000,3753000,4649000,59307000

        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
        dw 11542,14430,15257,17800

        db 21 dup(32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32)
data ends

code segment
start:
        mov ax,data
        mov ds,ax
        mov bx,0
        mov si,168
        mov di,210
        mov cx,21
s:
        mov ax,[bx]
        mov [di],ax
        mov ax,[bx+2]
        mov [di+2],ax
        mov ax,[bx+84]
        mov [di+5],ax
        mov dx,[bx+86]
        mov [di+7],dx
        div word ptr [si]
        mov dx,[si]
        mov [di+10],dx
        mov [di+13],ax
        add si,2
        add bx,4
        add di,16
        loop s
        mov ax,4c00h
        int 21h
code ends
end start

功能是实现了。可是书中说“这个程序是。。。。,它几乎用到了我们以前学习过的所有知识和编程技巧。...”


实现在实现了。可是没有进一步的改进。欢迎指正。
zhuzhu
[第1楼]   [ 回复时间:2007-10-11 15:58 ]   [引用]   [回复]   [ top ] 
荣誉值:50
信誉值:0
注册日期:2007-07-08 09:33
顶一下,欢迎大家来讨论~
fishboy
[第2楼]   [ 回复时间:2007-10-11 18:41 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
你没有用到什么知识??
所有知识不等于写的代码都表现出来吧。难道用变址寻址没用立即数寻址也算没用到多有知识么?!楼主太较真了。好的程序,好的逻辑,好的思路,足够了。如果,你认为你没有用到XX知识,那你就再用那些知识做一下。多了有时候不是丰富,反而是累赘。个人观点,欢迎指正。
caoheqian
[第3楼]   [ 回复时间:2007-11-04 18:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-09-30 21:53
高手啊。程序简洁明了,厉害。
多看别人的代码真长见识啊。
caoheqian
[第4楼]   [ 回复时间:2007-11-04 19:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-09-30 21:53
assume cs:code 

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" 

    dd 16,22,382,1356,2369,8000,16000,24486,50065,97479,140417,197514 
    dd 345980,590872,803530,1183000,1843000,2759000,3753000,4649000,59307000 

    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 
    dw 11542,14430,15257,17800 

data ends 

table segment
  db 21 dup ('year summ ne ?? ')
table ends

code segment 
start: 
    mov ax,data 
    mov ds,ax 
    mov bx,0 
    mov si,168 
mov di,0    
mov ax,table
    mov es,ax
    mov cx,21 
s: 
    mov ax,[bx] 
    mov es:[di],ax 
    mov ax,[bx+2] 
    mov es:[di+2],ax 
    mov ax,[bx+84] 
    mov es:[di+5],ax 
    mov dx,[bx+86] 
    mov es:[di+7],dx 
    div word ptr [si] 
    mov dx,[si] 
    mov es:[di+10],dx 
    mov es:[di+13],ax 
    add si,2 
    add bx,4 
    add di,16 
    loop s 
    mov ax,4c00h 
    int 21h 
code ends 
end start 

改编了一下。
sdfop123
[第5楼]   [ 回复时间:2008-01-08 20:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-12-05 16:47
assume cs:code,ds:data,cs: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'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ??')
table ends
code segment
start:mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov si,0
mov di,0
mov cx,21
s:mov al,[bx]
mov [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
mov ax,54h[bx]
mov dx,56h[bx]
mov es:5h[di],ax
mov es:7h[di],dx
mov ax,0a8h[si]
mov es:0ah[di],ax
mov ax,54h[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
code ends
end start
cook702
[第6楼]   [ 回复时间:2008-01-08 21:28 ]   [引用]   [回复]   [ top ] 
荣誉值:40
信誉值:2
注册日期:2007-06-26 11:53
厉害呀
yugong
[第7楼]   [ 回复时间:2008-10-10 11:04 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:8
注册日期:2008-09-15 09:10
厉害 
看别人的代码真长见识
flyinet
[第8楼]   [ 回复时间:2009-04-10 22:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-15 16:03
都是高手
hansonjan
[第9楼]   [ 回复时间:2009-05-18 21:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-13 22:27
我也做完了。昨天有参考过楼上的贴子!加了点注释.昨天做了5个小时都没做出来!后来发现是心理太浮躁了。
各位借鉴!认真一点的话,很容易的。
assume cs:code

data segment
  db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'

  dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,14417,197514
  dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

  dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  dw 11542,14430,15257,17800

data ends

table segment
  db 21 dup(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
table ends
;es指向table
;bx作为行标,列标直接用bx+数字表示        循环一次+16
;ds指向data段                                
;bp指向年份                                相对于ds的变址寄存,循环一次+4
;si指向年收入                                相对于dp固定变址
;di指向雇员人数                                相对于ds变址,循环一次+2
code segment
 start:        
        mov ax,table
        mov es,ax
        mov bx,0        

        mov ax,data
         mov ds,ax
        mov bp,0H
        mov si,54H
        mov di,0a8H
        
        mov cx,21
    s:        
        mov al,[bp]                        ;从data段提数据
        mov es:[bx],al                        ;装到table段中
        mov al,[bp+1]
        mov es:[bx+1],al                  ;年份
        mov al,[bp+2]
        mov es:[bx+2],al                  ;年份
        mov al,[bp+3]
        mov es:[bx+3],al                  ;年份

        mov ax,[di]                        ;雇员人数
        mov word ptr es:[bx+0aH],ax        ;进行除法运算时,需要占用ax和dx两个寄存器.所以先把人数字段装过去

        mov ax,[bp+si]                        ;年收入,低16位
        mov dx,[bp].2[si]                ;年收入, 高16位
        mov word ptr es:[bx+5],ax        ;年收入
        mov word ptr es:[bx+7],dx        ;年收入

        div word ptr [di]                ;用除法计算个人收入,商放在ax中,余数在dx中
                                
        mov word ptr es:[bx+0dH],ax        ;个人收入

        add bx,10H                        ;设置下一行的起始单元
        add di,2                        ;di指向雇员人数        相对于ds变址,循环一次+2
        add bp,4                        ;bp指向年份     相对于ds的变址寄存,循环一次+4
        loop s

        mov ax,4c00H
        int 21H        
code ends

end start
891204dh
[第10楼]   [ 回复时间:2009-08-05 14:50 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-04-08 06:33
楼主的程序不错!我们来看结果
这是我Debug楼主程序的结果,希望你们写程序都加注释!便于别人看,也便于自己日后看
在地址1430:0110处你的商是54H,我的是55H,这里是2390/28的商,你的确是2369/28,要认真啊,你抄错多处了,你再算算你程序里的最后一年收入除以最后一年的人数,也就是59307000/17800=0D03H,你的却只有一个03H?你的商的高位0DH丢了,地址1430:0210处的01H这个数是怎么回事?
你的表格不符合实验要求
-dds:d0 21f
1430:00D0  88 45 31 39 37 35 20 10-00 00 00 20 03 00 20 05   .E1975 .... .. .
1430:00E0  00 20 31 39 37 36 20 16-00 00 00 20 07 00 20 03   . 1976 .... .. .
1430:00F0  00 20 31 39 37 37 20 7E-01 00 00 20 09 00 20 2A   . 1977 ~... .. *
1430:0100  00 20 31 39 37 38 20 4C-05 00 00 20 0D 00 20 68   . 1978 L... .. h
1430:0110  00 20 31 39 37 39 20 41-09 00 00 20 1C 00 20 54   . 1979 A... .. T
1430:0120  00 20 31 39 38 30 20 40-1F 00 00 20 26 00 20 D2   . 1980 @... &. .
1430:0130  00 20 31 39 38 31 20 80-3E 00 00 20 82 00 20 7B   . 1981 .>.. .. {
1430:0140  00 20 31 39 38 32 20 A6-5F 00 00 20 DC 00 20 6F   . 1982 ._.. .. o
1430:0150  00 20 31 39 38 33 20 91-C3 00 00 20 DC 01 20 69   . 1983 .... .. i
1430:0160  00 20 31 39 38 34 20 C7-7C 01 00 20 0A 03 20 7D   . 1984 .|.. .. }
1430:0170  00 20 31 39 38 35 20 81-24 02 00 20 E9 03 20 8C   . 1985 .$.. .. .
1430:0180  00 20 31 39 38 36 20 8A-03 03 00 20 A2 05 20 88   . 1986 .... .. .
1430:0190  00 20 31 39 38 37 20 7C-47 05 00 20 D2 08 20 99   . 1987 |G.. .. .
1430:01A0  00 20 31 39 38 38 20 18-04 09 00 20 E9 0A 20 D3   . 1988 .... .. .
1430:01B0  00 20 31 39 38 39 20 CA-42 0C 00 20 C5 0F 20 C7   . 1989 .B.. .. .
1430:01C0  00 20 31 39 39 30 20 18-0D 12 00 20 03 16 20 D1   . 1990 .... .. .
1430:01D0  00 20 31 39 39 31 20 38-1F 1C 00 20 22 20 20 E0   . 1991 8... "  .
1430:01E0  00 20 31 39 39 32 20 58-19 2A 00 20 16 2D 20 EF   . 1992 X.*. .- .
1430:01F0  00 20 31 39 39 33 20 28-44 39 00 20 5E 38 20 04   . 1993 (D9. ^8 .
1430:0200  01 20 31 39 39 34 20 28-F0 46 00 20 99 3B 20 30   . 1994 (.F. .; 0
1430:0210  01 20 31 39 39 35 20 F8-F3 88 03 20 88 45 20 03   . 1995 .... .E .
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved