8086寄存器结构例题【微机原理】

简介: 8086寄存器结构例题【微机原理】

前言

以下内容源自微型计算机原理(第四版)王忠民主编

8086寄存器结构【微机原理】

应用例题源于课堂PPT

8086寄存器结构例题【微机原理】

仅供学习交流使用

8086寄存器结构应用例题

1、通用寄存器

1)数据寄存器 AX、BX、CX、DX

ax应用例题

寄存器AX用作累加器, CX用作计数器的特定用法举例:

ax.asm

code    segment 
  assume  cs:code
  start:
  mov  cx, 10
  mov  ax,  0
  mov  bx,1
  next:
  add   ax,bx
  inc    bx
  dec   cx
  jnz    next
  mov ah,4ch
  int   21h
code    ends
  end start

类似C语言

#include<stdio.h>
void main(){
  int cx=10;
  int ax=0;
  int bx=1;
  while(cx>0){
    ax+=bx;
    bx++;
    cx--;
  }
//  printf("%d",ax);//55
} 

bx应用例题

寄存器BX用作基址寄存器的特定用法举例:

bx.asm

data segment 
   x dw   1,2,3,4,5,-5,-4,-3,-2-1  
data ends
code    segment
    assume  cs:code, ds:data
  start:
    mov ax, data
    mov   ds, ax
    mov   cx, 10
    mov   ax,0
    mov   bx, offset  x
  next:
    add ax,  [bx]
    inc bx
    inc bx
    dec    cx
    jnz   next
    mov   ah, 4ch
    int 21h
code  ends
  end start


类似C语言

#include<stdio.h>
void main(){
  int x[10]={1,2,3,4,5,-5,-4,-3,-2,-1};
  int cx=10;
  int ax=0;
  int *bx;
  bx=x;
  while(cx>0){
    ax+=*bx;
    bx++;
    cx--;
  }
//  printf("%d",ax);//0
} 

2)地址寄存器 SP、BP

通过堆栈操作指令PUSH和POP指令 观察堆栈指针的变化

sp.asm

code    segment
    assume cs:code
start:
    MOV AX,1
    MOV BX,2
    PUSH  AX
    PUSH  BX
    ADD AX,BX
    POP BX
    POP AX
    mov ah,4ch
    int 21h
code    ends
    end start

类似C语言

//例子不太贴切
#include<stdio.h>
void main(){
  int sp[2]={0,0};//栈 
  int ax=1;
  int bx=2;
  //初始SP=0000
  //每执行一次PUSH SP-=2 
  sp[0]=ax;//PUSH SP=FFFE
  sp[1]=bx;//PUSH SP=FFFC
//  printf("%d,%d\n",ax,bx);//1,2
  ax+=bx;
//  printf("%d,%d\n",ax,bx);//3,2
  //每执行一次POP SP+=2  
  bx=sp[1];//POP SP=FFFE
  ax=sp[0];//POP SP=0000
//  printf("%d,%d\n",ax,bx);//1,2
} 

3)变址寄存器SI、DI

字符串操作时源变址寄存器SI(放源串在数据段内的偏移地址)

和目的变址寄存器DI(放目的串在附加数段内的偏移地址)的使用。

bp.asm

data    segment
  x   db  "0123456789$"
data    ends
datae   segment
  y   db 20 dup('$')
datae   ends
code    segment
   assume cs:code,ds:data,es:datae  
start:
  mov ax,data
  mov ds,ax
  mov ax,datae
  mov es,ax
  mov si,offset x
  mov di,offset y
  cld
  mov  cx,10
  rep movsb
  mov ah,4ch  
  int 21h
code ends
 end start

cld的使用

cld

rep movsb的使用

rep movsb

类似C语言

#include<stdio.h>
#include<string.h> 
#include<stdlib.h>
void main(){
  char* ds="123456789"; 
  char* es;
  es=(char*)malloc(sizeof(20));
  int si=0;
  int di=0;
  //cld
  int cs=10;
  while(cs>0){
    es[si++]=ds[di++];
    cs--;
  }
//  rep movsb
  puts(es);
} 

2、段寄存器

ds.asm

data    segment ;定义一个名字叫data的数据段
    x1   db   "The source string: 1234567890$"
data  ends
datae segment     ;定义一个名字叫datae的附加数据段
    x2   db   "The desource string: 0987654321$"
datae   ends
datas segment  stack   ;定义一个名字叫datas的堆栈段
    x3   dw   100 dup  ('$')
datas   ends
code  segment ;定义一个名字叫code的代码段
        assume cs:code,ds:data,es:datae,ss:datas
start:
    mov   ax,data
        mov   ds,ax
                    mov   ax,datae
        mov   es,ax
    mov   ax,datas
        mov   ss,ax
                    mov sp,length x3  
                    mov ah,09h
    mov dx,offset x1
    int   21h
    mov ah,09h
    mov dx,offset x2
    int   21h
    push  ax
    push  bx
    push  cx
    pop cx
    pop bx
    pop ax
code  ends
    end start 

参考

Debug工具的使用

  • 清楚
CS(Code Segment)称为代码段寄存器,
DS(Data Segment)称为数据段寄存器,
SS(Stack Segmen)称为堆栈段寄存器,
ES(Extra Segment)称为附加数据段寄存器
  • debug
  • r 查看、改变CPU寄存器的内容(第一个int 21h执行完之后)


    u将内存中的机器指令翻译成汇编指令


    d 查看内存中的内容
  • 查看CS中的内容d 0079(根据r的结果)
  • 会发现和u的结果差不多


    或者


    第一个int 21h执行之后





    d ss:0



3、控制寄存器

IP

FLAGS

1)状态标志位

2)控制标志位

标志寄存器相关状态位情况分析

flags.asm

data    segment ;定义一个名字叫data的数据段
    x   db   11101111b    ;-120
    y   db    11001000b   ;-118
data  ends
code  segment ;定义一个名字叫code的代码段
        assume cs:code,ds:data
start:
    mov   ax,data
        mov   ds,ax
    mov   al,x
        add al,y
    mov ah,4ch
    int 21h
code  ends
    end start
; CF=1,OF=0,ZF=0, SF=1,AF=1,PF=1





相关文章
|
9月前
3 位操作指令【微机原理】
3 位操作指令【微机原理】
23 0
|
9月前
80x86指令寻址方式【微机原理】
80x86指令寻址方式【微机原理】
101 0
【51单片机】一个简单的例子TMOD&TCON带你永远理解【(不)可位寻址】
【51单片机】一个简单的例子TMOD&TCON带你永远理解【(不)可位寻址】
|
C语言
基于MCS-51的交通灯程序设计(c语言控制直行左转)
一、说明:本程序与之前例程不同,采用c语言完成,实现四个方向的直走和左转车辆控制,采用51定时器精确计时二、原理图:三、基本设计思想: 1、硬件部分。七段数码管显示时间,采用共阳数码管,与P0口连接。
1533 0