(2011.10.29)汇编_王爽_第08章_学习小结

 

(2011.10.29)汇编_王爽_第08章_学习小结

本章主要内容:

1. div除法指令

2. dup指令

3. 寻址方式的综合应用

4. 偏移地址的寄存器的使用:bx, si, di, bp

5. ptr的使用

 

||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

 

需注意的知识点:

1. push指令只进行字操作

2. mov word ptr ds:[0], 1  用word ptr指明了指令访问的内存单元是一个字单元。

3. 当在偏移地址中包括bp时, […bp],段地址就默认在ss中,(ss)*16+bp

4. bx,si,di,bp四种寄存器可以单独出现,也可以双个出现,不用多个同时出现,

当两个出现的时候,只能bx与 si或di搭配,bp与si或di搭配,即可以将其分为两组:

组1是 (bx, bp), 组2是(si, di), 同组内的成员不能同时出现,只能异组搭配。

 

||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

; 程序名称:实验7_寻址方式在结构化数据访问中的应用.asm
; 程序功能:将几个数据段的内容放到一段数据段中,并使用除法计算数值。
; 题目如下:编程,将data段中的数据按如下格式写入到table段中,
;           并计算21年中的人均收入(取整),结果也按下面的格式保存在table段中。
; ____________________________________________________________________________________________
; | 行起始地址   | 年份(4字节)  |空| 收入(4字节)  |空| 雇员数(2字节  ) |空 |  人均收入(2字节)|空|
; | table:0    |     1975     |格|     16       |格|       3        |格 |       ???        |格|
; | table:10H  |     1976     |  |     22       |  |       7        |  |       ???        |  |
; | table:20H  |     1977     |  |     382      |  |       9        |  |       ???        |  |
; | table:30H  |     1978     |  |     1356     |  |       13       |  |       ???        |  |
; | table:40H  |     1979     |  |     2390     |  |       28       |  |       ???        |  |
; | table:50H  |     1980     |  |     8000     |  |       38       |  |       ???        |  |
;               ..........................................................................                         
;               ..........................................................................                           
; | table:140H |     1995     |  |     5937000  |  |       17800    |  |       ???        |  |
; |____________|______________|__|______________|__|________________|__|__________________|__|

assume cs:codesg, ds:data, ds:table

data segment
    db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983', '1984', '1985'
    db '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995'
    ; 以上表示21年的21个字符串(年份)(4字节)
    
    dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514, 345980
    dd 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
    ; 以上表示21年公司总收入的21个dword型数据(收入)(4字节)
    
    dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635
    dw 8226, 11542, 14430, 15257, 17800
    ; 以上是表示21年公司雇员人数的21个word型数据
data ends

table segment
    db 21 dup ('year summ ne ?? ')  ; dup指令,用于数据的重复
                                    ; db 重复的次数 dup (重复的字节型数据)
                                    ; dw 重复的次数 dup (重复的字型数据)
                                    ; dd 重复的次数 dup (重复的双字型数据)
                                    ; dd:用来定义dword(double word, 双字)
table ends 

codesg segment
start:
    mov ax, data
    mov ds, ax                      ; 首先将data数据段放入ds中,用于提取数据时所用的地址
    
    mov ax, table
    mov es, ax                      ; 然后将table数据段放入es中,用于放入时所用的地址
    
    mov bx, 0                       ; 将源内存分为两个起点,此为其一
    mov si, 168                     ; 将源内存分为两个起点,此为其二
    mov di, 0                       ; 目的内存的偏移地址
    
    mov cx, 21                      ; 一共有二十一年,因为设置循环次数为21
s:
    mov al, ' '                     ; byte ptr 指明了指令访问的内存单元是一个字节单元
    mov es:[di].4, al
    mov es:[di].9, al
    mov es:[di].12, al
    mov es:[di].15, al              ; 以上,先将一年中数据为空格的内存单元设为空格
    
    mov ax, ds:[bx].0               ; 将年份放入目的地址
    mov es:[di].0, ax 
    mov ax, ds:[bx+2].0 
    mov es:[di+2].0, ax
    
    mov ax, ds:[bx].84              ; 将收入放入目的地址
    mov es:[di].5, ax
    mov ax, ds:[bx+2].84
    mov es:[di+2].5, ax   
    
    mov ax, ds:[si]                 ; 将雇员数放入目的地址
    mov es:[di].10, ax
    
;   div除法指令
;   div          8位      16位
;   被除数       ax       dx*10000H + ax
;   除数         [...]     [...]
;   商           al       ax
;   余数         ah       dx
    
;   计算人均收入:总收入除以人数
    mov dx, es:[di].7
    mov ax, es:[di].5                   ; 将被除数放入dx与ax中
    div word ptr es:[di].10             ; 进行除法并且设定除数
    mov es:[di].13, ax                  ; 结果会被放到ax中,将ax的结果放入目标内存中
                                    
    add di, 16
    add si, 2
    add bx, 4
    loop s
    
    mov ax, 4c00h
    int 21h
    
codesg ends
end start
            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值