第八章 数据处理的两个问题---汇编笔记

转载:https://blog.csdn.net/qq_37340753/article/details/81539890
作者:jak0018

数据处理的两个基本问题

  1. 要处理的数据在什么地方?
  2. 要处理的数据有多长?

机器指令处理的数据在什么地方

对于机器指令这一层来说,并不关心数据的值是多少,而关心指令执行前一刻,它将要处理的数据所在的位置,所要处理的数据可以在3个地方:CPU内部、内存、端口(端口将在后面的课程中进行讨论)。
在这里插入图片描述


指令要处理的数据有多长

8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中药指明,指令进行的是字操作还是字节操作。对于这个问题,汇编语言中用以下方法处理。

(1)通过寄存器名指明要处理的数据的尺寸。例如:

字操作:mov ax,1 | mov bx,ds:[0] | mov ds,ax | mov ds:[0],ax | inc ax | add ax,1000。
字节操作:mov al,1 |mov al,bl | mov al,ds:[0] | mov ds:[0],al | inc al | add al,100

(2)在没有寄存器名存在的情况下,用操作符X pt 指明内存单元的长度,X在汇编指令中可以为word或byte。例如:
字操作:mov word ptr ds:[0],1 | inc word ptr [bx] | inc word ptr ds:[0] | add word ptr [bx],2。
字节操作:mov byte ptr ds:[0],1 | inc byte ptr [bx] | inc byte ptr ds:[0] | add byte ptr [bx],2。
(3)其他方法。有些指令默认访问的是字单元还是字节单元。例如:push [1000H]就是访问字。


div指令

div是除法指令,使用div做除法的时候应该注意以下问题:
除数:有8位和16位两种,在一个reg或内存单元中。
被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。
结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。

格式如:div reg | div 内存单元。

例子:
(1)div byte ptr ds:[0],含义:
(al)=(ax)/((ds)∗16+0)的商
(ah)=(ax)/((ds)∗16+0)的余数
(2)div word ptr es:[0],含义:
(ax)=[(dx)∗10000H+(ax)]/((es)∗16+0)的商
(dx)=[(dx)∗10000H+(ax)]/((es)∗16+0)的余数

编程,利用除法指令计算100001/100。
分析:先将100001转换为16进制形式是186A1H。程序如下:

mov dx,1
mov ax,86A1H
mov bx,100
div bx

实验7 寻址方式在结构化数据访问中的应用
Power idea公司从1975年成立一支到1995年的基本情况如下。
在这里插入图片描述下面的程序中,已经定义好了这些数据:

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

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

编程,将data段中的数据按如下格式写入table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中。

assume cs:codesg

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

table segment
    db 21 dup('year sum ne ?? ') ;总长度16
table ends


codesg segment
start:
  
    ;初始段  
    mov ax,data
    mov ds,ax
    mov ax,table
    mov es,ax 
         
    ;先把年份放入
    mov bx,0 
    mov bp,0         
    mov cx,21
s:  ;mov dd ptr 一个double的长度,一个寄存器存不下
    ;像除法一样,小端放在ax中,大端放在dx中
    mov ax,ds:[bx]
    mov dx,ds:[bx+2]
    mov es:[bp],ax
    mov es:[bp+2],dx
    mov es:[bp+4],' '  ;放一个空格 
    add bx,4 
    add bp,10h
    loop s 
    
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;把收入放进去 
    mov bp,0
    mov cx,21
s1:    
    mov ax,ds:[bx]   ;由于连续,bx指针继续累加
    mov dx,ds:[bx+2]
    mov es:[bp+5],ax
    mov es:[bp+7],dx
    mov es:[bp+9],' '  ;放一个空格 
    add bx,4 
    add bp,10h
    loop s1
    
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;把人均收入放入
    mov bp,0
    mov cx,21
s2:
    mov ax,ds:[bx]   ;由于连续,bx指针继续累加
    mov es:[bp+0ah],ax
    mov es:[bp+0ch],' '  ;放一个空格 
    add bx,2 
    add bp,10h
    loop s2
    
    
    ;;;;;;;;;;;;;;;;;;;;;;;;
    ;求人均收入  
    ;不要傻不拉几的去数据段调取
    mov bp,0
    mov cx,21 
s3:    
    mov ax,es:[bp+5]
    mov dx,es:[bp+7]
    div word ptr es:[bp+0ah] 
    mov es:[bp+0dh],ax  
    mov es:[bp+0fh],' ' ;放一个空格
    add bp,10h  
    loop s3
              
    
    mov ax,4c00h
    int 21h
    

codesg ends
end start    
    

在这里插入图片描述

发布了104 篇原创文章 · 获赞 134 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/89278343