• 汇编学习--第七天


    1:数据寄存器,一般称之为通用寄存器组 

         8086 有8个8位数据寄存器, 
         这些8位寄存器可分别组成16位寄存器: 

    AH&AL=AX:累加寄存器,常用于运算; 

    BH&BL=BX:基址寄存器,常用于地址索引;

    CH&CL=CX:计数寄存器,常用于计数;

    DH&DL=DX:数据寄存器,常用于数据传递。 


    2:地址寄存器/段地址寄存器 

         为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:

    CS(Code Segment):代码段寄存器; 

    DS(Data Segment):数据段寄存器; 

    SS(Stack Segment):堆栈段寄存器; 

    ES(Extra Segment):附加段寄存器。 


    3:特殊功能的寄存器 

    IP(Instruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程; 

    SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。 

    BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; 

    SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; 

    DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。 

    8.4 寻址方式

    总共就五种,

    常量---[idata]---[idata]---直接寻址

    寄存器---[ax],[di]..---[bx]---(寄存器)间接寻址

    常量+寄存器---[ax+idata],[bp+idata]...---[bx].idata, idata[bx], [bx][idata]---(寄存器)相对寻址

    基址寄存器+变址寄存器---[bx+di],[bp+si]---[bx]---基址变址寻址

    基址寄存器+变址寄存器+常量---[bx+di+idata]...---[bx].idata[di], idata[bx][di]---相对基址变址寻址

    8.5 指令要处理的数据有多长

    在汇编指令中指明是字操作还是字节操作

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

    mov ax,1
    
    mov bx,ds:[0]
    
    inc ax
    
    add ax,1000
    mov al,1
    
    mov al,bl
    
    mov al,ds:[0]
    
    inc al
    
    add al, 100

    (2)使用X ptr指明内存单元的长度

    mov word ptr ds:[0],1
    
    inc word ptr [bx]
    
    inc word ptr ds:[0]
    
    add word ptr [bx],2
    mov word ptr ds:[0],1
    
    inc word ptr [bx]
    
    inc word ptr ds:[0]
    
    add word ptr [bx],2

    应用

    mov ax,2000h
    mov ds,ax
    mov byte ptr [1000h],1
    mov word ptr [1010h],1

    8.6 寻址方式的综合应用

    mov ax,seg
    mov ds,ax
    mov bx,60h
    
    mov word ptr [bx+och],38
    add word ptr [bx+oeh],70
    
    mov si,0
    mov byte ptr [bx+10h+si],'V'
    inc si
    mov byte ptr [bx+10h+si],'A'
    inc si
    mov byte ptr [bx+10h+si],'X'

    8.7 div指令

    (1)除数:有8位和16位两种,在一个reg或者内存单元中

    (2)被除数:默认放在AX或者DX和AX中,如果除数为8位,被除数为16位,默认放在AX中;如果除数为16位,被除数为32位,在DX和AX中存放,DX存高六位,AX存低六位。

    (3)结果:如果除数为8位。则AL储存除法操作的商,AH储存除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数

    div reg

    div 内存单元

    div byte ptr ds:[0]

    含义:(al) = (ax) / ((ds) * 16 + 0)的商

       (ah) = (ax) / ((ds) * 16 + 0)的余数

    div word ptr es:[0]

    含义:(ax) = [(dx) * 10000H + (ax)] / ((es) * 16 + 0)的商

       (dx) = [(dx) * 10000H + (ax)] / ((es) * 16 + 0)的余数

    div byte ptr [bx+si+8]

    含义:(al) = (ax) / ((ds) * 16 + (bx) + (si) + 8)的商

       (al) = (ax) / ((ds) * 16 + (bx) + (si) + 8)的余数

    计算100001 / 100

    100001 > 65535

    计算 10001 / 100

    8.8 伪指令dd

    db定义字节型数据,dw定义字型数据

    dd定义dword(double word)型数据

    问题 8.1

    assume cs:codesg,ds:datasg
    datasg segment
        dd 100001
        dw 100
        dw 0
    datasg ends
    codesg segment
    start:    mov ax,datasg
            mov ds,ax
            
            mov ax,ds:[0]      ;低16位储存在ax
            mov dx,ds:[2]      ;高16位储存在dx
            div word ptr ds:[4]    ;必须指明ds:[4]的大小
            mov ds:[6],ax
            
            mov ax,4c00h
            int 21h
    codesg ends
    end start

    8.9 dup

    assume cs:codesg,ds:datasg
    datasg segment
        db 50 dup ('biu ')
    datasg ends
    codesg segment
            mov ax,4c00h
            int 21h
    codesg ends
    end

    实验 7  寻址方式在结构化数据访问中的应用

    这道出得很好,很综合的考查了前面所学知识。

    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年公司总收入的dword型数据 4 * 21 = 84
    
    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型数据 2 * 21 = 42
    data ends
    
    table segment
    db 21 dup ('year summ ne ?? ') ; 'year summ ne ?? ' 刚好16个字节
    table ends
    
    code segment
    start:    mov ax,data
            mov ds,ax
            mov ax,table
            mov es,ax
    
            mov cx,21    ;外层循环每一年的情况
            mov bx,0    ;表示第几年的情况
            mov di,0    ;存储年份地址
            
            mov bp,0    ;1.获取到data段中雇员数数据 2.保存bx的值
    s0:        push cx    
            mov cx,4
            mov si,0    ;表示这一年中的第几个
            
            ;年份
    s:        mov al,ds:[di]        ;一位一位保存字符
            mov es:[bx+si],al
            
            ;收入
            mov al,ds:[di+54h]    
            mov es:[bx+si+5h],al
            
            inc si
            inc di
            loop s
            
            ;雇员数
            mov ax,ds:[bp+0a8h]    ;单独保存数据
            mov es:[bx+0ah],ax
            add bp,2    ;到段的下一个字的数据
            
            ;人均收入
            mov dx,es:[bx+7h]    ;高16位被除数
            mov ax,es:[bx+5h]    ;低16位被除数
            push bx    ;存放除数
            push bp    ;存放bx地址
            mov bp,bx
            mov bx,es:[bp+0ah]
            div bx
            mov es:[bp+0dh],ax        ;余数在dx中,只保存了商
            pop bp
            pop bx
            
            pop cx
            add bx,10h
            loop s0
            
            mov ax,4c00h
            int 21h
    code ends
    end start

  • 相关阅读:
    对文本抽取词袋模型特征
    jieba分词
    家用电器用户行为分析与事件识别
    Linux系统调用:创建和终止进程
    Linux系统调用:获取进程PID
    使用函数指针解决函数重载二义性调用问题
    C++ string基本操作
    有界深度优先搜索-八数码问题
    数据传送指令
    x86-64数据格式、通用寄存器与操作数格式
  • 原文地址:https://www.cnblogs.com/Mayfly-nymph/p/11087561.html
Copyright © 2020-2023  润新知