ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

汇编 | 数据处理的两个基本问题

2022-01-18 15:33:50  阅读:192  来源: 互联网

标签:基本 汇编 21 mov si 数据处理 ax ds es


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

  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内部,内存,端口

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

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

寻址方式

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

指令要处理的数据有多长

前面将到分为隐式给出和显式给出,例如通过寄存器和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')

实验七

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

assume ds:data, es:table, 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'
    ; 以上是表示 21 年的 21 个字符串

    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
    dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
    ; 以上是表示 21 年公司总收入的 21 个 dword 型数据
    
    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw 11542,14430,15257,17800
    ; 以上是表示 21 年公司雇员人数的 21 个 word 型数据
data ends

;            年份(4 字节) - 收入(4 字节) -  雇员数(2 字节) - 人均收入(2 字节) -
;  table:0         '1975'            16                3                   ?
;  table:10H       '1976'            22                7                   ?
;  ...
;  table:140H      '1995'        593700            17800                   ?
table segment
    db 21 dup ('year summ ne ?? ') ; 字符串占据 16 个字节
table ends

code segment

start:
    ; 初始化 data 和 table 指向
    mov ax, data
    mov ds, ax
    mov ax, table
    mov es, ax

    ; 初始化偏移寄存器
    mov bx, 0 ; 将用于年份和总收入的偏址
    mov di, 0 ; 将用于雇员数的偏址
    mov si, 0 ; 将用于 table 的偏址

    mov cx, 21 ; 21年

s:
    ; 写入年份
    mov ax, ds:0[bx]
    mov es:0[si], ax
    mov ax, ds:2[bx]
    mov es:2[si], ax

    mov al, 20h ; 添加空格
    mov es:4[si], al

    ; 写入总收入
    mov ax, ds:84[bx] ;  ; 21 x 4 = 84
    mov es:5[si], ax
    mov ax, ds:86[bx]
    mov es:7[si], ax

    mov al, 20h
    mov es:9[si], al

    ; 写入雇员数
    mov ax, ds:168[di] ; 21 * 4 + 21 * 4 = 168
    mov es:10[si], ax

    mov al, 20h
    mov es:12[si], al

    ; 人均收入
    mov ax, ds:84[bx]
    mov dx, ds:86[bx] ; ; 被除数:总收入
    mov bp, ds:168[di]  ; 除数:雇员数

    div bp              ; 除法结果:商在 ax,余数在 dx

    mov es:13[si], ax

    mov al, 20h
    mov es:15[si], al

    ; 递增偏址变量
    add bx,4    ; 年份和总收入 ;年份和总收入都是双字单元,故bx的递增量是4
    add di,2    ; 雇员数, ;人数是字单元,故di的递增量是2
    add si,16   ; table行  ;table中每行是16个字节,偏移量为16

    loop s
    
    mov ax, 4c00H
    int 21H
    
code ends
end start

标签:基本,汇编,21,mov,si,数据处理,ax,ds,es
来源: https://www.cnblogs.com/RioTian/p/15818061.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有