WEB开发网
开发学院软件开发汇编语言 简明x86汇编语言教程(3) 阅读

简明x86汇编语言教程(3)

 2010-01-10 09:37:43 来源:WEB开发网   
核心提示:现在我们来写一小段汇编程序,修改EAX、EBX、ECX、EDX的数值,简明x86汇编语言教程(3)(2),我们假定程序执行之前,寄存器中的数值是全0: ? X H

现在我们来写一小段汇编程序,修改EAX、EBX、ECX、EDX的数值。

我们假定程序执行之前,寄存器中的数值是全0:

  ? X
H L
EAX 0000 00 00
EBX 0000 00 00
ECX 0000 00 00
EDX 0000 00 00

正如前面提到的,EAX的高16bit是没有办法直接访问的,而AX对应它的低16bit,AH、AL分别对应AX的高、低8bit。

mov eax, 012345678h
mov ebx, 0abcdeffeh
mov ecx, 1
mov edx, 2
; 将012345678h送入eax
; 将0abcdeffeh送入ebx
; 将000000001h送入ecx
; 将000000002h送入edx

则执行上述程序段之后,寄存器的内容变为:

  ? X
H L
EAX 1234 56 78
EBX abcd ef fe
ECX 0000 00 01
EDX 0000 00 02

那么,你已经了解了mov这个指令(mov是move的缩写)的一种用法。它可以将数送到寄存器中。我们来看看下面的代码:

mov eax, ebx
mov ecx, edx
; ebx内容送入eax
; edx内容送入ecx

则寄存器内容变为:

  ? X
H L
EAX abcd ef fe
EBX abcd ef fe
ECX 0000 00 02
EDX 0000 00 02

我们可以看到,“move”之后,数据依然保存在原来的寄存器中。不妨把mov指令理解为“送入”,或“装入”。

练习题

把寄存器恢复成都为全0的状态,然后执行下面的代码:

mov eax, 0a1234h
mov bx, ax
mov ah, bl
mov al, bh
; 将0a1234h送入eax
; 将ax的内容送入bx
; 将bl内容送入ah
; 将bh内容送入al

思考:此时,EAX的内容将是多少?[答案]

下面我们将介绍一些指令。在介绍指令之前,我们约定:

使用Intel文档中的寄存器表示方式

reg32 32-bit寄存器(表示EAX、EBX等) reg16 16-bit寄存器(在32位处理器中,这AX、BX等) reg8 8-bit寄存器(表示AL、BH等) imm32 32-bit立即数(可以理解为常数) imm16 16-bit立即数 imm8 8-bit立即数

在寄存器中载入另一寄存器,或立即数的值:

mov reg32, (reg32 | imm8 | imm16 | imm32)
mov reg32, (reg16 | imm8 | imm16)
mov reg8, (reg8 | imm8)

例如,mov eax, 010h表示,在eax中载入00000010h。需要注意的是,如果你希望在寄存器中装入0,则有一种更快的方法,在后面我们将提到。

交换寄存器的内容:

xchg reg32, reg32
xchg reg16, reg16
xchg reg8, reg8

例如,xchg ebx, ecx,则ebx与ecx的数值将被交换。由于系统提供了这个指令,因此,采用其他方法交换时,速度将会较慢,并需要占用更多的存储空间,编程时要避免这种情况,即,尽量利用系统提供的指令,因为多数情况下,这意味着更小、更快的代码,同时也杜绝了错误(如果说Intel的CPU在交换寄存器内容的时候也会出错,那么它就不用卖CPU了。而对于你来说,检查一行代码的正确性也显然比检查更多代码的正确性要容易)刚才的习题的程序用下面的代码将更有效:

mov eax, 0a1234h
mov bx, ax
xchg ah, al
; 将0a1234h送入eax
; 将ax内容送入bx
; 交换ah, al的内容

上一页  1 2 3 4  下一页

Tags:简明 汇编语言 教程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接