前言
以下内容源自微型计算机原理(第四版)王忠民主编
应用例题源于课堂PPT
仅供学习交流使用
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的使用
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
参考
- 清楚
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