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

请添加图片描述

在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日星月云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值