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

  • ​​前言​​
  • ​​8086寄存器结构应用例题​​
  • ​​1、通用寄存器​​
  • ​​1)数据寄存器 AX、BX、CX、DX​​
  • ​​ax应用例题​​
  • ​​bx应用例题​​
  • ​​2)地址寄存器 SP、BP​​
  • ​​3)变址寄存器SI、DI​​
  • ​​2、段寄存器​​
  • ​​3、控制寄存器​​
  • ​​IP​​
  • ​​FLAGS​​
  • ​​1)状态标志位​​
  • ​​2)控制标志位​​

前言

以下内容源自微型计算机原理(第四版)王忠民主编
​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

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


类似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执行完之后)
  • 8086寄存器结构例题【微机原理】_寄存器_02

  • u将内存中的机器指令翻译成汇编指令
  • 8086寄存器结构例题【微机原理】_微机原理_03

  • d 查看内存中的内容
  • 查看CS中的内容d 0079(根据r的结果)
  • 会发现和u的结果差不多
  • 8086寄存器结构例题【微机原理】_#include_04

  • 或者
  • 8086寄存器结构例题【微机原理】_#include_05

  • 第一个int 21h执行之后
  • 8086寄存器结构例题【微机原理】_#include_06

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

  • d ss:0
  • 8086寄存器结构例题【微机原理】_寄存器_08

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

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

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