首页 > 其他分享 >8086寄存器结构例题【微机原理】

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

时间:2022-11-16 12:07:19浏览次数:47  
标签:8086 int mov 微机 cx 寄存器 ax 例题 bx


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寄存器结构例题【微机原理】_微机原理


类似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寄存器结构例题【微机原理】_#include_03

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

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

  • 第一个int 21h执行之后
  • 8086寄存器结构例题【微机原理】_数据段_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


标签:8086,int,mov,微机,cx,寄存器,ax,例题,bx
From: https://blog.51cto.com/u_15719556/5855684

相关文章

  • 【MYSQL例题】
    1、【出处:牛客网】题目:运营想要了解每个学校答过题的用户平均答题数量情况,请取出数据用户信息表user_profile:其中device_id指终端编号(认为每个用户有唯一的一个终端),gende......
  • c语言第二例题
    题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间......
  • 画出8086CPU的工作原理示意图,并将以说明
    8086CPU工作原理图 由于8086CPU采用16位结构,所以8086CPU在内部用地址加法器将两个16地址合成一个20位的物理地址,来提高寻址能力。通过20位的地址总线传送到存储器,在对应......
  • SVM 超平面计算例题
    SVMSummaryExampleSupposethedatasetcontainstwopositivesamples\(x^{(1)}=[1,1]^T\)and\(x^{(2)}=[2,2]^T\),andtwonegativesamples\(x^{(3)}=[0,0]^T\)......
  • SVM 超平面计算例题
    SVMSummaryExampleSupposethedatasetcontainstwopositivesamples\(x^{(1)}=[1,1]^T\)and\(x^{(2)}=[2,2]^T\),andtwonegativesamples\(x^{(3)}=[0,0]^T\)......
  • 一个动态规划的简单例题
    动态规划(DynamicProgramming)它是计算机中解决最优化问题的一种方法,效率高,速度快。一般思路:1、穷举法/暴力搜索2、记忆化搜索/剪枝3、改写成迭代形式思想1.动......
  • string例题
    判断邮箱输入是否合法,并且判断输入的邮箱是否是新浪邮箱privatestaticvoiddemo1(){System.out.println("请输入您的邮箱");Stringemail=input.next();......
  • BFS广度优先搜索例题分析
    洛谷P1162填涂颜色题目描述由数字\(0\)组成的方阵中,有一任意形状闭合圈,闭合圈由数字\(1\)构成,围圈时只走上下左右\(4\)个方向。现要求把闭合圈内的所有空间都填写......
  • DFS深度优先搜索例题分析
    洛谷P1596LakeCountingS题面翻译由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个\(N\timesM(1\timesN\times100,1\leqM\leq100)\)的网格图......
  • 【数据结构】例题:表达式求值 C++实现
    先写一个链栈#pragmaonce///链栈的结点类型template<classDataType>classStackNode{public: DataTypedata; StackNode*next; StackNode(){ next=nul......