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
类似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的使用
cldrep 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