. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->数据处理的两个基本问题
主题 : :  绝了!比置顶程序还要牛的程序,不另外定义段,只用23条汇编指令完成程序要求。比最牛程序少用了七行代码。  [待解决] 回复[ 66次 ]   点击[ 6561次 ]  
netson
[帖 主] [ 发表时间:2009-07-02 10:50 ] 
荣誉值:0
信誉值:0
注册日期:2008-09-26 07:46
code segment 
start:mov ax,data 
      mov ds,ax 
      mov bx,0 
      mov si,0a8h 
      mov ax,table 
      mov ss,ax 
      mov bp,0 
      mov cx,21 
    s:mov ax,[si] 
      mov [bp+0ah],ax 
      mov ax,[bx] 
      mov dx,{bx+2} 
      mov [bp],ax 
      mov [bp+2],dx 
      mov ax,[54h+bx] 
      mov dx,[56h+bx] 
      mov [bp+05h],ax 
      mov [bp+07h],dx 
      div word ptr [bp+0ah] 
      mov [bp+0dh],ax 
      add bx,4 
      add si,2 
      add bp,10h 
      loop s 
      mov ax,4c00h
      int 21h
code ends 
end start 
我的QQ:479488993       我的博客:http://www.asmedu.net/blog/user/usermain.jsp?neighborId=14266  希望与热爱技术的人为伍。
zzqcn
[第50楼] [ 回复时间:2015-06-23 18:12 ] 
荣誉值:0
信誉值:0
注册日期:2015-06-19 10:06
我的代码。为了简便,我只造了5组数据,书上的21组太多了。
借鉴了以上各楼的思想,没有用栈。win7 64bit + DosBox 测试通过。
---------------------------------------------

; 结构化寻址演练
; 将公司数据输入表格并计算年人均收入

assume cs:code

data segment
    db '1975', '1976', '1977', '1978', '1979'   ; 年份
    dd 345980, 590827, 803530, 1183000, 1843000 ; 总收入
    dw 5635, 8226, 11542, 14430, 15257          ; 人数
data ends

table segment
    db 5 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
    
    mov bx, 0       ; 初始化各数据索引
    mov si, 0
    mov di, 0
    
    mov cx, 5       ; 设置循环次数
    
 s:
    ; 源数据的3个结构体分别是
    ; 年份    ds:0[si]  共4字节
    ; 总收入  ds:20[si] 共4字节
    ; 员工数  ds:40[di] 共2字节
    ;
    ; table数据的结构体为 es:[bx]
    ; 4个成员分别是
    ; 年份     es:[bx].0   或  es:0[bx]
    ; 总收入   es:[bx].5   或  es:5[bx]
    ; 员工数   es:[bx].10  或  es:10[bx]
    ; 平均收入 es:[bx].13  或  es:13[bx]
    mov ax, 0[si]    ; 复制年份
    mov es:[bx].0[0], ax
    mov ax, 0[si+2]
    mov es:[bx].0[2], ax
    
    mov ax, 20[si] ; 复制总收入
    mov es:[bx].5[0], ax
    mov dx, 20[si+2]
    mov es:[bx].5[2], dx
    
    mov ax, 40[di] ; 复制员工数
    mov es:[bx].10, ax
    
    ; 被除数总收入为32字节,AX中为低16位,DX为高16位
    ; 除数员工数为16字节,结果中商放在AX,余数放在DX
    ; 把复制总收入的代码写在复制员工数代码的后面,可以
    ; 少些一条ax的赋值语句
    mov ax, 20[si]         ; 计算人均收入
    div word ptr 40[di]
    ;div word ptr es:[bx].10
    
    mov es:[bx].13, ax
    
    add si, 4
    add di, 2
    add bx, 16
    loop s
    
    mov ax, 4c00H
    int 21H
code ends

end start
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved