本文的代码在Visual Studio 2019下完成
这4个寄存器都是16位寄存器,他们都可以随心所欲的使用,但是,原则上还是有一些约定俗成的用途的,所以我们在使用的时候也应该尽可能的按照这些约定去使用,大致如下
一:AX寄存器
AX是16位寄存器,由AH+AL两个8位寄存器组成
(1)用于数据中转:高级语言反汇编中CPU通常使用ax进行中转数据,比如要往ds寄存器中放数据的话,不可以mov ds,0001H
这样写,而是应该先mov ax,0001H
,然后再mov ds,ax
(2)作为MUL指令默认使用:当使用MUL指令两个数相乘的时候,其中一个数必定在AX寄存器中,详见MUL指令
一:BX寄存器
BX是16位寄存器,由BH+BL两个8位寄存器组成
高级语言反汇编中CPU通常使用bx寄存器来存放偏移地址,注意,使用该寄存器存放偏移地址的时候,则CPU默认取DS寄存器的段地址,而不是SS的段地址
下面将666H这个值放到10000这个物理地址的内存中
1
2
3
4
5mov ax,1000H mov ds,ax mov bx,0H mov [bx],666H
下面的代码是利用BX寄存器来改变偏移地址,求一个长度为5的int类型数组的总和
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27int main() { int* pa = (int*)malloc(20); int sum = 1; if (pa != 0) { pa[0] = 1; pa[1] = 2; pa[2] = 3; pa[3] = 4; pa[4] = 5; std::cout << pa << std::endl; _asm { mov eax, 0 mov ebx, pa mov ecx,5 s:add eax, [ebx] mov sum, eax inc ebx inc ebx inc ebx inc ebx loop s } std::cout << sum << std::endl; } }
还有一种常用的,使用BX的,偏移方式,格式是[BX+常量]
,也可以写成常量[BX]
,也可以写成[BX].常量
,例如下面都是正确且常用的
1
2
3
4
5
6// 下面写法都表示bx里存的是一个内存地址,将这个地址+200个字节,得到一个新 // 的地址,再将新的地址里面的值,赋到ax寄存器中 mov ax,[200+bx] mov ax,200[bx] mov ax,[bx].200
三:CX寄存器
CX是16位寄存器,由CH+CL两个8位寄存器组成
高级语言反汇编中CPU通常使用bx寄存器存放循环语句的循环次数,字符串操作中也常用,C++中类的成员函数的参数就是用ECX存放,如果见到ECX,基本可以认为这是一个函数参数,下面是loop指令自动读取cx中的值作为次数的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include <stdio.h> #include <iostream> int main() { int a = 0; _asm { mov eax, 0; // 循环10次 mov ecx, 10; s:inc eax; // loop指令会判断ecx是否=0,如果不等于=,则代码跳到s处执行 loop s; mov a, eax; } 此处会打印出10 std::cout << a << std::endl; }
四:DX寄存器
也叫数据寄存器,DX是16位寄存器,由DH+DL两个8位寄存器组成
(1)在乘法中,结果都是存放到AX中的,但是如果发生进位,则高位会存放到DX中,详见MUL指令
(2)在整数除法中存放产生的余数
(3)在IO中用于存放端口地址
最后
以上就是冷艳鲜花最近收集整理的关于Intel8086处理器-通用寄存器之AX/BX/CX/DX的全部内容,更多相关Intel8086处理器-通用寄存器之AX/BX/CX/DX内容请搜索靠谱客的其他文章。
发表评论 取消回复