在汇编时不能使用寄存器eax

时间:2014-04-02 15:07:07

标签: assembly segmentation-fault nasm

在我的代码开头我尝试过:

mov [eax],0

并且遇到了段错误。

我想我之前必须初始化eax,但我不知道该怎么做。

编辑:更一般地说,我想使用32位寄存器来计算事物。无论哪一个。

帮助??

非常感谢:)

2 个答案:

答案 0 :(得分:3)

mov [eax],0向值eax寻址的内存移动零。 (用C语言,*eax = 0;。)你写的是你无权写的地址。

mov eax,0将零移至eax。 (用C语言,eax = 0;。)这就是你想要做的吗?

答案 1 :(得分:0)

如果指令的通用寄存器放在方括号[]之间,则汇编程序将把寄存器解释为地址寄存器,并将寄存器的值解释为指令所指向的偏移地址,以及细分部分地址。

示例:

BLUB dd 0FFFFFFFFh  ; a 32 bit value is stored in a memmory location

; Loading the segment part of the address into a segmentregister
; Note: an instruction of "mov segmentregister,immediate value" does not exist
; and so we have to use an all purpose register, or a memory location for to
; load the segment part of an address into a segmentregister

mov ax,SEG BLUB     ; load the segment-address into the AX-Register
mov ds,ax           ; load the segment-address form AX into DS-Register

mov eax,OFFSET BLUB ; load the offset part of the address into EAX

; load the value where the address-pair of DS:EAX is pointing to into EBX
mov ebx,[eax]


但是如果我们只想使用一些寄存器进行计算,那么我们可以简单地将立即值加载到通用寄存器中。

示例:

mov al,0FFh         ; low byte of AX
mov ah,0FFh         ; high byte of AX
mov ax,0FFFFh       ; low word of EAX
mov eax,0FFFFFFFFh  ; dword