导航:首页 > 净水问答 > x86esiedi

x86esiedi

发布时间:2022-07-12 10:03:37

⑴ 汇编中eax,ecx,edx,ebx,esp,ebp,esi,edi,eip分别是什么有什么用

这些来是32位的CPU中32位的寄存器的名字自。

寄存器是CPU内部的用于运行中暂存数据的存储单元。

在PC用的16位CPU 8086、8088中,寄存器的名字分别是AX(累加器),BX(基址寄存器),CX(计数寄存器),DX(数据寄存器),SP(堆栈指针),BP(基址指针),SI(源变址寄存器),DI(目的变址寄存器),IP(指令指针),等等……

这些寄存器除了从名字可以看得出来的用途以外,一部分寄存器也可以作为通用的一般数据寄存使用。具体每个寄存器的功能要与各种具体的指令关联起来才能理解清楚。

在386以上的32位CPU中,这些寄存器扩展成了32位的,名字就是在原来16位的名字前面加一个字母E,变成了EAX,EBX,…………

⑵ X86指令集的内容有哪些

x86汇编指令集

数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
1. 通用数据传送指令.
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.

MOVSX reg16,r/m8 ; o16 0F BE /r [386]
MOVSX reg32,r/m8 ; o32 0F BE /r [386]
MOVSX reg32,r/m16 ; o32 0F BF /r [386]

MOVZX reg16,r/m8 ; o16 0F B6 /r [386]
MOVZX reg32,r/m8 ; o32 0F B6 /r [386]
MOVZX reg32,r/m16 ; o32 0F B7 /r [386]

PUSH 把字压入堆栈.
POP 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
XADD 先交换再累加.( 结果在第一个操作数里 )
XLAT 字节查表转换.
—— BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即
0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
2. 输入输出端口传送指令.
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,
其范围是 0-65535.
3. 目的地址传送指令.
LEA 装入有效地址.
例: LEA DX,string ;把偏移地址存到DX.
LDS 传送目标指针,把指针内容装入DS.
例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
LES 传送目标指针,把指针内容装入ES.
例: LES DI,string ;把段地址:偏移地址存到ES:DI.
LFS 传送目标指针,把指针内容装入FS.
例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
LGS 传送目标指针,把指针内容装入GS.
例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
LSS 传送目标指针,把指针内容装入SS.
例: LSS DI,string ;把段地址:偏移地址存到SS:DI.
4. 标志传送指令.
LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈.
POPF 标志出栈.
PUSHD 32位标志入栈.
POPD 32位标志出栈.

二、算术运算指令
———————————————————————————————————————
ADD 加法.
ADC 带进位加法.
INC 加 1.
AAA 加法的ASCII码调整.
DAA 加法的十进制调整.
SUB 减法.
SBB 带借位减法.
DEC 减 1.
NEC 求反(以 0 减之).
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
AAS 减法的ASCII码调整.
DAS 减法的十进制调整.
MUL 无符号乘法.
IMUL 整数乘法.
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
AAM 乘法的ASCII码调整.
DIV 无符号除法.
IDIV 整数除法.
以上两条,结果回送:
商回送AL,余数回送AH, (字节运算);
或 商回送AX,余数回送DX, (字运算).
AAD 除法的ASCII码调整.
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)

三、逻辑运算指令
———————————————————————————————————————
AND 与运算.
OR 或运算.
XOR 异或运算.
NOT 取反.
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL 逻辑左移.
SAL 算术左移.(=SHL)
SHR 逻辑右移.
SAR 算术右移.(=SHR)
ROL 循环左移.
ROR 循环右移.
RCL 通过进位的循环左移.
RCR 通过进位的循环右移.
以上八种移位指令,其移位次数可达255次.
移位一次时, 可直接用操作码. 如 SHL AX,1.
移位>1次时, 则由寄存器CL给出移位次数.
如 MOV CL,04
SHL AX,CL

四、串指令
———————————————————————————————————————
DS:SI 源串段寄存器 :源串变址.
ES:DI 目标串段寄存器:目标串变址.
CX 重复次数计数器.
AL/AX 扫描值.
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
Z标志 用来控制扫描或比较操作的结束.
MOVS 串传送.
( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )
CMPS 串比较.
( CMPSB 比较字符. CMPSW 比较字. )
SCAS 串扫描.
把AL或AX的内容与目标串作比较,比较结果反映在标志位.
LODS 装入串.
把源串中的元素(字或字节)逐一装入AL或AX中.
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
STOS 保存串.
是LODS的逆过程.
REP 当CX/ECX<>0时重复.
REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
REPC 当CF=1且CX/ECX<>0时重复.
REPNC 当CF=0且CX/ECX<>0时重复.

五、程序转移指令
———————————————————————————————————————
1>无条件转移指令 (长转移)
JMP 无条件转移指令
CALL 过程调用
RET/RETF过程返回.
2>条件转移指令 (短转移,-128到+127的距离内)
( 当且仅当(SF XOR OF)=1时,OP1 JA/JNBE 不小于或不等于时转移.
JAE/JNB 大于或等于转移.
JB/JNAE 小于转移.
JBE/JNA 小于或等于转移.
以上四条,测试无符号整数运算的结果(标志C和Z).
JG/JNLE 大于转移.
JGE/JNL 大于或等于转移.
JL/JNGE 小于转移.
JLE/JNG 小于或等于转移.
以上四条,测试带符号整数运算的结果(标志S,O和Z).
JE/JZ 等于转移.
JNE/JNZ 不等于时转移.
JC 有进位时转移.
JNC 无进位时转移.
JNO 不溢出时转移.
JNP/JPO 奇偶性为奇数时转移.
JNS 符号位为 "0" 时转移.
JO 溢出转移.
JP/JPE 奇偶性为偶数时转移.
JS 符号位为 "1" 时转移.
3>循环控制指令(短转移)
LOOP CX不为零时循环.
LOOPE/LOOPZ CX不为零且标志Z=1时循环.
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
JCXZ CX为零时转移.
JECXZ ECX为零时转移.
4>中断指令
INT 中断指令
INTO 溢出中断
IRET 中断返回
5>处理器控制指令
HLT 处理器暂停, 直到出现中断或复位信号才继续.
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.
ESC 转换到外处理器.
LOCK 封锁总线.
NOP 空操作.
STC 置进位标志位.
CLC 清进位标志位.
CMC 进位标志取反.
STD 置方向标志位.
CLD 清方向标志位.
STI 置中断允许位.
CLI 清中断允许位.

六、伪指令
———————————————————————————————————————
DW 定义字(2字节).
PROC 定义过程.
ENDP 过程结束.
SEGMENT 定义段.
ASSUME 建立段寄存器寻址.
ENDS 段结束.
END 程序结束.

七、寄存器

1. Register usage in 32 bit Windows
Function parameters are passed on the stack according to the calling conventions listed on
page 13. Parameters of 32 bits size or less use one DWORD of stack space. Parameters
bigger than 32 bits are stored in little-endian form, i.e. with the least significant DWORD at the
lowest address, and DWORD aligned.
Function return values are passed in registers in most cases. 8-bit integers are returned in
AL, 16-bit integers in AX, 32-bit integers, pointers, and Booleans in EAX, 64-bit integers in
EDX:EAX, and floating-point values in ST(0). Structures and class objects not exceeding
64 bits size are returned in the same way as integers, even if the structure contains floating
point values. Structures and class objects bigger than 64 bits are returned through a pointer
passed to the function as the first parameter and returned in EAX. Compilers that don\'t
support 64-bit integers may return structures bigger than 32 bits through a pointer. The
Borland compiler also returns structures through a pointer if the size is not a power of 2.
Registers EAX, ECX and EDX may be changed by a procere. All other general-purpose
registers (EBX, ESI, EDI, EBP) must be saved and restored if they are used. The value of
ESP must be divisible by 4 at all times, so don\'t push 16-bit data on the stack. Segment
registers cannot be changed, not even temporarily. CS, DS, ES, and SS all point to the flat
segment group. FS is used for a thread environment block. GS is unused, but reserved.
Flags may be changed by a procere with the following restrictions: The direction flag is 0
by default. The direction flag may be set temporarily, but must be cleared before any call or
return. The interrupt flag cannot be cleared. The floating-point register stack is empty at the
entry of a procere and must be empty at return, except for ST(0) if it is used for return
value. MMX registers may be changed by the procere and if so cleared by EMMS before
returning and before calling any other procere that may use floating-point registers. All
XMM registers can be modified by proceres. Rules for passing parameters and return
values in XMM registers are described in Intel\'s application note AP 589 "Software
Conventions for Streaming SIMD Extensions". A procere can rely on EBX, ESI, EDI, EBP
and all segment registers being unchanged across a call to another procere.
2. Register usage in Linux
The rules for register usage in Linux appear to be almost the same as for 32-bit windows.
Registers EAX, ECX, and EDX may be changed by a procere. All other general-purpose
registers must be saved. There appears to be no rule for the direction flag. Function return
values are transferred in the same way as under Windows. Calling conventions are the
same, except for the fact that no underscore is prefixed to public names. I have no
information about the use of FS and GS in Linux. It is not difficult to make an assembly
function that works under both Windows and Linux, if only you take these minor differences
into account.

八、位操作指令,处理器控制指令
1.位操作指令,8086新增的一组指令,包括位测试,位扫描。BT,BTC,BTR,BTS,BSF,BSR
1.1 BT(Bit Test),位测试指令,指令格式:
BT OPRD1,OPRD2,规则:操作作OPRD1可以是16位或32位的通用寄存器或者存储单元。操作数OPRD2必须是8位立即数或者是与OPRD1操作数长度相等的通用寄存器。如果用OPRD2除以OPRD1,假设商存放在Divd中,余数存放在Mod中,那么对OPRD1操作数要进行测试的位号就是Mod,它的主要功能就是把要测试位的值送往CF,看几个简单的例子:
1.2 BTC(Bit Test And Complement),测试并取反用法和规则与BT是一样,但在功能有些不同,它不但将要测试位的值送往CF,并且还将该位取反。
1.3 BTR(Bit Test And Reset),测试并复位,用法和规则与BT是一样,但在功能有些不同,它不但将要测试位的值送往CF,并且还将该位复位(即清0)。
1.4 BTS(Bit Test And Set),测试并置位,用法和规则与BT是一样,但在功能有些不同,它不但将要测试位的值送往CF,并且还将该位置位(即置1)。
1.5 BSF(Bit Scan Forward),顺向位扫描,指令格式:BSF OPRD1,OPRD2,功能:将从右向左(从最低位到最高位)对OPRD2操作数进行扫描,并将第一个为1的位号送给操作数OPRD1。操作数OPRD1,OPRD2可以是16位或32位通用寄存器或者存储单元,但OPRD1和OPRD2操作数的长度必须相等。
1.6 BSR(Bit Scan Reverse),逆向位扫描,指令格式:BSR OPRD1,OPRD2,功能:将从左向右(从最高位到最低位)对OPRD2操作数进行扫描,并将第一个为1的位号送给操作数OPRD1。操作数OPRD1,OPRD2可以是16位或32位通用寄存器或存储单元,但OPRD1和OPRD2操作数的长度必须相等。
1.7 举个简单的例子来说明这6条指令:

AA DW 1234H,5678H
BB DW 9999H,7777H
MOV EAX,12345678H
MOV BX,9999H
BT EAX,8;CF=0,EAX保持不变
BTC EAX,8;CF=0,EAX=12345778H
BTR EAX,8;CF=0,EAX=12345678H
BTS EAX,8;CF=0,EAX=12345778H
BSF AX,BX;AX=0
BSR AX,BX;AX=15

BT WORD PTR [AA],4;CF=1,[AA]的内容不变
BTC WORD PTR [AA],4;CF=1,[AA]=1223H
BTR WORD PTR [AA],4;CF=1,[AA]=1223H
BTS WORD PTR [AA],4;CF=1,[AA]=1234H
BSF WORD PTR [AA],BX;[AA]=0;
BSR WORD PTR [AA],BX;[AA]=15(十进制)

BT DWORD PTR [BB],12;CF=1,[BB]的内容保持不变
BTC DWORD PTR [BB],12;CF=1,[BB]=76779999H
BTR DWORD PTR [BB],12;CF=1,[BB]=76779999H
BTS DWORD PTR [BB],12;CF=1,[BB]=77779999H
BSF DWORD PTR [BB],12;[BB]=0
BSR DWORD PTR [BB],12;[BB]=31(十进制)

2.处理器控制指令
处理器控制指令主要是用来设置/清除标志,空操作以及与外部事件同步等。
2.1 CLC,将CF标志位清0。
2.2 STC,将CF标志位置1。
2.3 CLI,关中断。
2.4 STI,开中断。
2.5 CLD,清DF=0。
2.6 STD,置DF=1。
2.7 NOP,空操作,填补程序中的空白区,空操作本身不执行任何操作,主要是为了保持程序的连续性。
2.8 WAIT,等待BUSY引脚为高。
2.9 LOCK,封锁前缀可以锁定其后指令的操作数的存储单元,该指令在指令执行期间一直有效。在多任务环境中,可以用它来保证独占其享内存,只有以下指令才可以用LOCK前缀:
XCHG,ADD,ADC,INC,SUB,SBB,DEC,NEG,OR,AND,XOR,NOT,BT,BTS,BTR,BTC
3.0 说明处理器类型的伪指令
.8086,只支持对8086指令的汇编
.186,只支持对80186指令的汇编
.286,支持对非特权的80286指令的汇编
.286C,支持对非特权的80286指令的汇编
.286P,支持对80286所有指令的汇编
.386,支持对80386非特权指令的汇编
.386C,支持对80386非特权指令的汇编
.386P,支持对80386所有指令的汇编
只有用伪指令说明了处理器类型,汇编程序才知道如何更好去编译,连接程序,更好地去检错。

九,FPU instructions(摘自fasm的帮助文档中,有时间我会反它翻译成中文的)
The FPU (Floating-Point Unit) instructions operate on the floating–point
values in three formats: single precision (32–bit), double precision (64–bit)
and double extended precision (80–bit). The FPU registers form the stack
and each of them holds the double extended precision floating–point value.
When some values are pushed onto the stack or are removed from the top,
the FPU registers are shifted, so st0 is always the value on the top of FPU
stack, st1 is the first value below the top, etc. The st0 name has also the
synonym st.
fld pushes the floating–point value onto the FPU register stack. The
operand can be 32–bit, 64–bit or 80–bit memory location or the FPU register,
it’s value is then loaded onto the top of FPU register stack (the st0 register)
and is automatically converted into the double extended precision format.
fld dword [bx] ; load single prevision value from memory
fld st2 ; push value of st2 onto register stack
fld1, fldz, fldl2t, fldl2e, fldpi, fldlg2 and fldln2 load the commonly
used contants onto the FPU register stack. The loaded constants are
+1.0, +0.0, log2 10, log2 e, pi, log10 2 and ln 2 respectively. These instructions
have no operands.
fild convert the singed integer source operand into double extended precision
floating-point format and pushes the result onto the FPU register stack.
The source operand can be a 16–bit, 32–bit or 64–bit memory location.
fild qword [bx] ; load 64-bit integer from memory
fst copies the value of st0 register to the destination operand, which can
be 32–bit or 64–bit memory location or another FPU register. fstp performs
the same operation as fst and then pops the register stack, getting rid of
st0. fstp accepts the same operands as the fst instruction and can also
store value in the 80–bit memory.
fst st3 ; value of st0 into st3 register
fstp tword [bx] ; store value in memory and pop stack
fist converts the value in st0 to a signed integer and stores the result
in the destination operand. The operand can be 16–bit or 32–bit memory
location. fistp performs the same operation and then pops the register
stack, it accepts the same operands as the fist instruction and can also store
integer value in the 64–bit memory, so it has the same rules for operands as
fild instruction.
fbld converts the packed BCD integer into double extended precision
floating–point format and pushes this value onto the FPU stack. fbstp
converts the value in st0 to an 18–digit packed BCD integer, stores the
result in the destination operand, and pops the register stack. The operand
should be an 80–bit memory location.
fadd adds the destination and source operand and stores the sum in the
destination location. The destination operand is always an FPU register,
if the source is a memory location, the destination is st0 register and only
source operand should be specified. If both operands are FPU registers, at
least one of them should be st0 register. An operand in memory can be a
32–bit or 64–bit value.
fadd qword [bx] ; add double precision value to st0
fadd st2,st0 ; add st0 to st2
faddp adds the destination and source operand, stores the sum in the destination
location and then pops the register stack. The destination operand
must be an FPU register and the source operand must be the st0. When no
operands are specified, st1 is used as a destination operand.
38 CHAPTER 2. INSTRUCTION SET
faddp ; add st0 to st1 and pop the stack
faddp st2,st0 ; add st0 to st2 and pop the stack
fiadd instruction converts an integer source operand into double extended
precision floating–point value and adds it to the destination operand.
The operand should be a 16–bit or 32–bit memory location.
fiadd word [bx] ; add word integer to st0
fsub, fsubr, fmul, fdiv, fdivr instruction are similar to fadd, have
the same rules for operands and differ only in the perfomed computation.
fsub substracts the source operand from the destination operand, fsubr
substract the destination operand from the source operand, fmul multiplies
the destination and source operands, fdiv divides the destination operand by
the source operand and fdivr divides the source operand by the destination
operand. fsubp, fsubrp, fmulp, fdivp, fdivrp perform the same operations
and pop the register stack, the rules for operand are the same as for the faddp
instruction. fisub, fisubr, fimul, fidiv, fidivr perform these operations
after converting the integer source operand into floating–point value, they
have the same rules for operands as fiadd instruction.
fsqrt computes the square root of the value in st0 register, fsin computes
the sine of that value, fcos computes the cosine of that value, fchs
complements its sign bit, fabs clears its sign to create the absolute value,
frndint rounds it to the nearest integral value, depending on the current
rounding mode. f2xm1 computes the exponential value of 2 to the power of
st0 and substracts the 1.0 from it, the value of st0 must lie in the range ?1.0
to +1.0. All these instruction store the result in st0 and have no operands.
fsincos computes both the sine and the cosine of the value in st0 register,
stores the sine in st0 and pushes the cosine on the top of FPU register
stack. fptan computes the tangent of the value in st0, stores the result in
st0 and pushes a 1.0 onto the FPU register stack. fpatan computes the
arctangent of the value in st1 divided by the value in st0, stores the result
in st1 and pops the FPU register stack. fyl2x computes the binary logarithm
of st0, multiplies it by st1, stores the result in st1 and pop the FPU
register stack; fyl2xp1 performs the same operation but it adds 1.0 to st0
before computing the logarithm. fprem computes the remainder obtained
from dividing the

⑶ 汇编语言 esi,edi寄存器问题

都属于通用寄存器,所以一般场景下都可以随便用。就是有些传送指令规定了esi是源,edi是目的

⑷ x86汇编 ,基础,关于[ebp]

mov edi,[ebp+8] ; ebp+8是一个局部变量,类型是指针char*,即字符串的首地址。功能是把字符串的首地址赋值给edi

mov esi,edi; esi=edi=字符串的首地址

find_end:
mov al,[esi] ;得到当前的地址里的字符值
inc esi ;指向下一个字符地址
; equal to lodsb increment esi

test al,al ;测试是否为字符串结束符\0

jnz find_end ;若不是结束符,则跳转到find_end,循环。

;esi point after \0, we need to go back 2 char
sub esi,2 ;调整esi,因为在测试al等于\0结束符时,esi已经inc了一次。调整后,esi指向字符串的最后一个字符。

ebp+8,是局部变量,是char*指针,[ebp+8]是指针的值,即字符串的地址。
还有,ebp+8仅仅只是一个指针,它指向的字符串可以在任何地址。
不要把ebp+8当成字符串,它仅仅是指向字符串。

⑸ edi,esi寄存器是什么寄存器有什么作用

EDI和ESI分别是16位寄存器DI和SI的32位扩展
它们是目的变址寄存器和源变址寄存器,用于串操作指令中。
同时,它们也可以作为通用寄存器使用。

⑹ 汇编语言中所有寄存器的作用

寄存器有点多,介绍常用的,通用寄存器8个,EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP,最后+eip+EFL;
eax多用于计算,函数的返回值等;
ecx多用于计数(count),比如循环中的那个计数,结合eax,ESI,edi。
ebp用于堆栈指针追踪,指低(debug版本),esp用于堆栈跟踪,多跟ebp一起使用(指向顶部,最高,也就是最前)。
esi,edi多用于复制内存。
eip就是固定作用了,CPU指令全靠它了,指那打哪。
efl就是标志寄存器了,16位就够用了,现在64位,完全空着呢,比如位溢出(两个计算数据太大溢出,不够减溢出),凡是条件(除了变态的jmp),无论if,while等,还是运算,或者符号位(数据是正还是负),或者数据检查,奇偶等,都是看它的。也就是说,无论CPU运算还是控制,都看它对应的不同位。
下面给你通用寄存器几个例子:假如eax的值为10,要将一块内存赋值为cc,循环10次,而EDI里面是内存地址的话,那么代码就是:mov EAX,0Xcc
mov ecx,0xa
rep stos byte ptr [edi]
这样,内存就全部被成为“ccccccccccccccccc”,这样的代码到处都是,尤其没有初始化之后,就能见到这样的CC,中文显示就是“烫烫烫”.
从一个内存赋值到另一个内存地址是这样的,假如esi是指针p1的地址,edi是指针p2的地址,那么*p2=*p1就是:
rep movs byte ptr es:[edi],byte ptr ds:[esi]
所以,edi,ESI,以及EBX,

⑺ 汇编语言寄存器都叫什么

1、寄存器

32位寄存器有16个,分别是:

4个数据寄存器(EAX、EBX、ECX、EDX)。

2个变址和指针寄存器(ESI和EDI);2个指针寄存器(ESP和EBP)。

6个段寄存器(ES、CS、SS、DS、FS、GS)。

1个指令指针寄存器(EIP);1个标志寄存器(EFlags)。


2、数据寄存器

数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。

32位CPU有4个32位通用寄存器:EAX、EBX、ECX和EDX。对低16位数据的取存,不会影响高16

位的数据,这些低16位寄存器分别命名为AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。

4个16位寄存器又可分割成8个独立的8位寄存器(AX:ah~al、BX:bh~bl、CX:ch~cl:DX:dh~dl)。

每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可合可分”的特性,灵活地处理字/

字节的信息。

AX和al通常称为累加器,用累加器进行的操作可能需要更少时间,累加器可用于乘、除、输入/输出等操作,

它们的使用频率很高。

BX称为基地址寄存器,它可作为存储器指针来使用。

CX称为计数寄存器,在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用cl来

指明位移的位数。

DX称为数据寄存器,在进行乘、除运算时,它可以为默认的操作数参与运算,也可用于存放I/O的端口地址。

在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU

中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据、保存算术逻辑运算结果,而且也可

作为指针寄存器,所以,这些32位寄存器更具有通用性。


3、变址寄存器

32位CPU有2个32位通用寄存器ESI和EDI,其低16位对应先前CPU中的SI和DI,对低16位数据的

存取,不影响高16位的数据。

ESI、EDI、SI和DI称为变址寄存器,它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器

操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

变址寄存器不可分割成8位寄存器,作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

它们可作一般的存储器指针使用,在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的

功能。


4、指针寄存器

32位CPU有2个32位通用寄存器EBP和ESP,其低16位对应先前CPU中的BP和SP,对低16位数

据的存取,不影响高16位的数据。

EBP、ESP、BP和SP称为指针寄存器,主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器

操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

指针寄存器不可分割成8位寄存器,作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

它们主要用于访问堆栈内的存储单元,并且规定:

BP为基指针寄存器,用它可直接存取堆栈中的数据。

SP为堆栈指针寄存器,用它只可访问栈顶。


5、段寄存器

段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成

的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。

32位CPU有6个段寄存器,分别如下:

CS:代码段寄存器 ES:附加段寄存器

DS:数据段寄存器 FS:附加段寄存器

SS:堆栈段寄存器 GS:附件段寄存器

在16位CPU系统中,只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问,在

32位微机系统中,它有6个段寄存器,所以在此环境下开发的程序最多可同时访问6个段。

32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的,有关规定

简单描述如下:

实方式:段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑

地址仍为“段地址:偏移地址”的形式,为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移地址。

保护方式:在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”的某个值。


6、指令指针寄存器


32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。

指令指针EIP、IP是存放下次将要执行的指令在代码段的偏移地址,在具有预取指令功能的系统中,下次要执

行的指令通常已被预取到指令队列中,除非发生转移情况,所以,在理解它们的功能时不考虑存在指令队列的情

况。

在实方式下,由于每个段的最大范围为64KB,所以,EIP的高16位肯定都为0,此时,相当于只用其低16

位的IP来反映程序中的指令的执行次序。


7、标志寄存器

1.运算结果标志位。一共6个,包括:CF进位标志位、PF奇偶标志位、AF辅助进位标志位、ZF零标志位、

SF符号标志位、OF溢出标志位。

2.状态控制标志位。一共3个,包括:TF追踪标志位、IF中断允许标志位、DF方向标志位。

以上标志位在第7章里都讲过了,在这里就不再解释了,现在讲讲32位标志寄存器增加的4个标志位。

1. I/O特权标志IOPL。

IOPL用两位二进制位来表示,也称为I/O特权级字段,该字段指定了要求执行I/O指令的特权级,如果当前

的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。

2. 嵌套任务标志NT。

NT用来控制中断返回指令IRET的执行。具体规定如下:

(1) 当NT=0,用堆栈中保存的值恢复EFlags、CS和EIP,执行常规的中断返回操作。

(2) 当NT=1,通过任务转换实现中断返回。

3. 重启动标志RF。

RF用来控制是否接受调试故障。规定:RF=0时,表示接受,否则拒绝。

4. 虚拟8086方式标志VM。

如果VM=1,表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。


8、32位地址的寻址方式

最后说一下32位地址的寻址方式。在前面我们学习了16位地址的寻址方式,一共有5种,在32位微机系统

中,又提供了一种更灵活、方便但也更复杂的内存寻址方式,从而使内存地址的寻址范围得到了进一步扩大。

在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为

偏移地址的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、

EDX、ESI、EDI、EBP、和ESP)都可以是偏移地址的一个组成部分。

当用32位地址偏移量进行寻址时,偏移地址可分为3部分:

1. 一个32位基址寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)。

2. 一个可乘以1、2、4、8的32位变址寄存器(EAX、EBX、ECX、EDX、ESI、EDI和EBP)。

3. 一个8位~32位的偏移常量。

比如,指令:mov ebx, [eax+edx*2+300]

Eax就是基址寄存器,edx就是变址寄存器,300H就是偏移常量。

上面那3部分可进行任意组合,省去其中之一或之二。

下面列举几个32位地址寻址指令:

Mov ax, [123456]

Mov eax, [ebx]

Mov ebx, [ecx*2]

Mov ebx, [eax+100]

Mov ebx, [eax*4+200]

Mov ebx, [eax+edx*2]

Mov ebx, [eax+edx*4+300]

Mov ax, [esp]

由于32位寻址方式能使用所有的通用寄存器,所以,和该有效地址相组合的段寄存器也就有新的规定,具体

规定如下:

1. 地址中寄存器的书写顺序决定该寄存器是基址寄存器还是变址寄存器。

如:[ebx+ebp]中的ebx是基址寄存器,ebp是变址寄存器,而[ebp+ebx]中的ebp是基址寄存器,ebx是变

址寄存器,可以看出,左边那个是基址寄存器,另一个是变址寄存器。

2. 默认段寄存器的选用取决于基址寄存器。

3. 基址寄存器是ebp或esp时,默认的段寄存器是SS,否则,默认的段寄存器是DS。

4. 在指令中,如果显式地给出段寄存器,那么显式段寄存器优先。

下面列举几个32位地址寻址指令及其内存操作数的段寄存器。

指令列举: 访问内存单元所用的段寄存器

mov ax, [123456] ;默认段寄存器为DS。

mov ax, [ebx+ebp] ;默认段寄存器为DS。

mov ebx, [ebp+ebx] ;默认段寄存器为SS。

mov ebx, [eax+100] ;默认段寄存器为DS。

mov edx, ES:[eax*4+200] ;显式段寄存器为ES。

mov [esp+edx*2], ax ;默认段寄存器为SS。

mov ebx, GS:[eax+edx*8+300] ;显式段寄存器为GS。

mov ax, [esp] ;默认段寄存器为SS。

⑻ 80X86微处理器有几代各代的名称是什么

1.7 Intel 80x86处理器简介

到此,您已经看到了两个将要实际编译和运行的HLA程序。然而至今为止,出现在程序中的所有语句要么是数据声明,要么是对HLA标准库例程的调用,还不是真正的汇编语言。在我们学习真正的汇编语言之前,必须理解Intel 80x86处理器系列的基本结构,否则机器指令将没有任何意义。

Intel 系列CPU一般都被归为冯·诺依曼式机器。冯·诺依曼计算机系统包括三个主要模块:中央处理单元(CPU),存储器和输入/输出设备(I/O)。这三部分通过系统总线(由数据、地址和控制总线组成)相连。图1-4中的模块图表示了这种关系。

图1-4 冯·诺依曼计算机系统模块图

CPU与存储器和I/O设备之间的通信方法是向地址总线发送一个数值来选取一个存储单元或者I/O设备端口,它们都有惟一的二进制地址。因此,CPU、I/O以及存储器设备都通过将数据放到数据总线上来传递彼此之间的数据。控制总线则包含用于确定数据传输方向(在内存之间,以及I/O设备之间)的信号。

在CPU当中,寄存器是其最主要的特征。80x86 CPU的寄存器可以分成四类:通用寄存器、特殊目的寄存器、段寄存器以及特殊目的核心模式寄存器。本书不会介绍最后两类寄存器。段寄存器在现代的32位操作系统(例如:Windows,BeOS和Linux)当中用得不多;由于本书是专门针对32位操作系统所编写的程序,所以不需要讨论段寄存器。特殊目的核心模式寄存器专门用来编写操作系统、调试器以及其他系统级工具。这些软件的构建远远超出了本书的范围,所以也无需讨论特殊目的核心模式寄存器。

80x86(Intel系列)CPU提供了几个通用寄存器。其中包含八个32位寄存器,如下所示:

EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP

每个名称的前缀‘E’代表扩展(extended)的意思。该前缀将32位寄存器与如下所示的八个16位寄存器区分开来:

AX、BX、CX、DX、SI、DI、BP、SP

最后,80x86 CPU还提供了八个8位的寄存器,它们的名称如下所示:

AL、AH、BL、BH、CL、CH、DL、DH

遗憾的是,这些并非都是分离的寄存器。即80 x 86并未提供24个独立的寄存器。实际上,80x86将16位寄存器重叠于32位寄存器之上,也将8位寄存器重叠于16位寄存器之上。图1-5给出了这种关系。

图1-5 80x86(Intel系列CPU)的通用寄存器

关于通用寄存器,需要注意的是它们并不独立。修改一个寄存器可能会影响其他三个寄存器。例如,对EAX的修改可能会影响寄存器AL,AH以及AX。这一点相当重要。在汇编语言初学者所编写的程序当中,一个很常见的错误就是寄存器值的破坏,因为这些编程人员尚未完全理解图1-5的含义。

EFLAGS是一个32位寄存器,它包含几个1位的布尔值(true/false)。EFLAGS寄存器中的大多数要么是为核心模式(操作系统)函数保留的,要么就是程序员不感兴趣的。其中有8位(或标志)是程序员编写汇编语言程序需要用到的。它们分别是溢出标志、方向标志、中断禁止[4]标志、符号标志、零标志、辅助进位标志、奇偶标志以及进位标志。图1-6显示了EFLAGS寄存器低16位中标志的布局情况。

在应用程序员感兴趣的8个标志中,有4个标志特别重要:溢出标志、进位标志、符号标志以及零标志。这4个标志统称为条件码[5]。根据这些标志的状态就可以测试前一次计算的结果。例如,在对两个值进行比较以后,条件码标志就会告诉您其中一个值是小于,等于还是大于另一个值。

图1-6 标志寄存器的布局(EFLAGS的低16位)

令汇编语言初学者惊讶的一个重要事实是,在80x86 CPU中进行的所有计算几乎都和寄存器有关。例如,将两个变量相加,把它们的和存入第3个变量中,必须先将其中一个变量装入一个寄存器中,并将第2个操作数和寄存器的值相加,然后将寄存器中的值存入目的变量。寄存器在每次计算中都充当媒介。因此,在80x86汇编语言程序中寄存器是非常重要的。

还有一点很重要,虽然某些寄存器被称为是“通用”的,但并不能就此推断每个寄存器都能随意使用。以寄存器对SP/ESP为例,它们就有特殊的目的,而不能用于任何其他的目的(它们是栈指针)。同样,寄存器BP/EBP也具有特殊目的,它们的使用受到限制而无法当作通用寄存器使用。所有80x86寄存器都有它们自己特殊的目的,因此它们都限定在一个范围内使用。目前,您应该避免将ESP和EBP寄存器用于一般的计算当中;还应该记住,余下的寄存器在程序中不可以完全互换。存储子系统

运行32位操作系统的80x86处理器可以访问多达232个不同的存储单元,或者四十多亿字节。在几年以前,4G字节的存储器是最大的;然而,现代的机器已经远远超出了这一限制。由于在使用像Windows和Linux这样的32位操作系统时,80x86体系结构支持最大4G字节的地址空间,下面的讨论将假设最大有4G字节的空间。

当然,您应该问的第一个问题是:“确切地说,什么是一个存储单元?”80x86支持字节可寻址存储器(byte addressable memory)。因此基本的存储单元就是一个字节,这足以容纳一个单字符或是一个(非常)小的整数值(第2章将更详细地讨论这一点)。

将内存看作是字节线性数组。首字节的地址为0,末字节的地址为。对于奔腾处理器来说,下面的伪Pascal数组声明就是一个对内存非常好的比拟:

Memory: array [0..4294967295] of byte;

C/C++和Java用户可能偏爱下面这种语法:

byte Memory[4294967296];

为了执行Pascal语句“Memory[125]:=0;”的等效语句,CPU将数值0放在数据总线上,将地址125放到地址总线上,并设置写信号线(通常要将该线置0),如图1-7所示。

图1-7 存储器的写操作

若执行“CPU:=Memory[125];”的等效语句,CPU会将地址125放到地址总线上,并设置读信号线(因为CPU正在从存储器读取数据),然后从数据总线上读取数据结果(如图1-8所示)。

图1-8 存储器的读操作

这里的讨论只适用于访问内存中单个字节的情况。那么当处理器访问一个字或者双字时又会如何呢?由于存储器由一个字节数组构成,那么我们应该怎样处理大于一个字节的数据呢?很简单,要存储更大的值,80x86使用连续的存储单元序列就可以了。图1-9给出了80x86如何在存储器中存储字节、字(双字节)以及双字(四字节)。每个对象的内存地址就是它的首字节地址(最低地址)。

现代的80x86处理器实际上并不直接与存储器相连。而是CPU上有一个专门的存储缓冲器称为高速缓存(cache),它充当CPU与主存储器之间的高速媒介。虽然高速缓存可以自动处理细节,但应该明白一个事实,即如果该对象的地址为对象长度的整数倍,那么访问内存中的数据对象的效率更高。因此,用4的整数倍的地址来对准四字节(双字)对象的确是个好主意。同样,让双字节对象对准偶数地址是最有效的。在后面的章节中,您将学习如何设置内存对象的对准。

图1-9 存储器中字节、字和双字的存储

在结束讨论内存对象以前,应该理解内存与HLA变量之间的相关性。使用像HLA这样的汇编器/编译器的一个好处是不必担心内存地址值。只需在HLA中声明一个变量,HLA负责将该变量与惟一一组内存地址集合相关联。例如,对于下面的声明段:

static

i8 :int8;

i16 :int16;

i32 :int32;

HLA将在内存中找到某个未使用的8位字节,将其与变量i8相关联;还将找到一对连续未使用的字节,并将它们与i16相关联。最后,HLA将找到4个连续未使用的字节,并将i32的值与这4个字节(32位)相关联。以后就要通过变量的名称来引用它们,而不必关心它们的地址值。但是,您仍然应该知道HLA在后台完成了这些工作。

⑼ 64和86有什么区别

1、表达的意思不同。

X64表达的意思是CPU为64位的操作系统。X86表达的意思是CPU为32位的操作系统

2、配置要求不同。

X64的操作系统只能安装在CPU为64位的计算机上。X86的操作系统可以安装在32位(32位CPU)或64位(64位CPU)电脑上。

3、运算速度不同。

X64的操作系统处理器一次可提取64位数据(只要两个指令,一次提取8个字节的数据),比32位(需要四个指令,一次提取4个字节的数据)提高了一倍,理论上性能会相应提升1倍。

4、支持的内存容量不同。

64位CPU和操作系统理论上最高可支持16EB内存。32位CPU和操作系统最大只可支持4GB内存。

5、引入个人计算机时间不同。

64位操作系统是2003年引入个人计算机领域。32位操作系统约20世纪90年代。

阅读全文

与x86esiedi相关的资料

热点内容
回寝室用日语怎么说 浏览:820
养殖场水槽怎么排污水 浏览:718
处理回用 浏览:297
花洒如何换滤芯 浏览:419
染化污水处理国外现状 浏览:355
时代沃顿反渗透膜淘宝 浏览:983
饮水机水流量小是什么原因 浏览:439
日本为处理福岛核废水花了多少钱 浏览:367
养斗鱼需要过滤泵吗 浏览:549
选矿废水循环利用现状 浏览:699
sla树脂材料 浏览:794
立升净水器怎么样值得装吗 浏览:992
负压吸尘器用什么滤芯 浏览:94
工业循环水超滤膜清洗药剂 浏览:356
世嘉空气滤芯在什么位置 浏览:172
反污水怎么处理 浏览:598
100cc废水比什么意思 浏览:679
净水桶发黄怎么洗 浏览:910
新材料产业园区污水处理工艺选择 浏览:816
空气滤芯影响动力多少 浏览:637