微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数据处理的两个基本问题

计算机是进行数据处理,运算的机器,所以存在两个问题:

  1. 处理的数据的位置
  2. 处理的数据的长度

这两个问题,必须在机器指令中给出说明(有时候是明确的,有时候是隐式的),否者计算器就无法工作。
定义的描述性符号:

  • reg(寄存器):ax,bx,cx,dx,ah,al···sp,bp,si,di
  • sreg(段寄存器):ds,ss,cs,es

bx,si,di和bp

总结:

  1. 在8086中,只有这四个寄存器可以用在[...]中进行内存寻址。
  2. [...]中,他们可以单个出现,或者以组合形式出现(组合中不能有其他寄存器,但可以有idata)
  3. bp的认段地址在ss中(和bx,si,di在ds中不同)

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

数据处理大致可分为三类:读取,写入,运算
指令执行前,所要处理的数据可以在3个地方:cpu内部,内存,端口

UTOOLS1560169885399.png

汇编语言中数据位置的表达

  1. 立即数(idata)
    对于直接包含在机器指令中的数据(执行前在cpu的指令缓冲器中),在汇编语言中称为:立即数(idata)
  2. 寄存器
    指令要处理的数据存放在寄存器中,给出对应寄存器名
  3. 段地址(SA)和偏移地址(EA)
    内存中的数据,通过SA+EA给出数据位置

寻址方式

定位内存单元的方法,即称为寻址方式

UTOOLS1561201400616.png

指令要处理的数据有多长

前面将到分为隐式给出和显式给出,例如通过寄存器和push,pop等方法就是隐式给出。
加入不能够明确指定数据长度的化,就需要显式给出数据长度。显式给出数据长度的方法ptr指令,例如:

mov word ptr ds:[0],1
mov byte ptr ds:[0],1
inc ...
add ...

div指令

div指令为除法指令
被除数 / 除数 = 商......余数

  1. 除数:有8位和16位两种(byte和word),在一个reg或者内存单元中
  2. 被除数:认放在ax或dx和ax中,当除数为8位时,被除数则为16位,认在ax中存放。当除数位16时,被除数则为32位,dx存放高16位,ax存放低16位。
  3. 结果:除数为8位,则al存储商,ah存储余数。如果除数为16位,则ax存储商,dx存储余数。

伪指令dd

有用到过db和dw,例如:

db 1 ;占1个字节
dw 1 ;占1个word(2个字节)

dd用来定义dword(double word,双子)。dd 1则占用2个word(4个字节)。

dup

dup是一个用于定义数据的操作符,由编译器识别。和db,dw,dd配合使用,用来进行数据的重复定义。
例如:
db 3 dup (0)
db 3 dup(0,1,2)
db 3 dup (‘abc‘,‘ABC‘)

实验七

答案

assume cs:code,ds:data,es: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‘
 ; 21年, 4*21=84个字节

 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
 ; 21年每年总收入,84字节

 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8826
 dw 11542,14430,15247,17800
 ; 21年每年雇佣人数, 42字节

data ends

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

stack segment
 dw 16 dup(0)
stack 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
s0:
 mov ax,0[bx].[0] 
 mov es:[si].[0],ax
 mov ax,0[bx][2]
 mov es:[si].[2],84[bx].[0]
 mov es:[si].[5],84[bx][2]
 mov es:[si].[7],168[di].[0]
 mov es:[si].[10],es:[si].[5] ; 计算人均收入
 mov dx,es:[si].[7]
 div word ptr es:[si].[10]
 mov es:[si].[13],ax 

 add bx,4
 add si,10H
 add di,2
 loop s0

 mov ax,4c00H
 int 21H

code ends

end start

table段的dup实际定义了21*16个字节,空格也在对应的位置填上了。



版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐