【问题标题】:Copying data from one variable to another将数据从一个变量复制到另一个变量
【发布时间】:2017-06-22 08:46:25
【问题描述】:

这是我编写的代码的一部分:

section .data
name db 'slm dada',0xa
lenname equ $-name
nane db 'bye '

section .text
global _start
_start:
mov edx, lenname
mov ecx, name
mov ebx, 1
mov eax, 4
int 80h

mov eax, [nane]           <- My questions are about
mov [name], dword eax     <- these 2 lines

mov edx, lenname
mov ecx, name
mov ebx, 1
mov eax, 4
int 80h

mov eax, 1
int 0x80

我有两个问题:

  1. 有没有办法不使用EAX寄存器将nane变量的值移动到name变量中?

  2. 为什么我们需要使用类型修饰符?

【问题讨论】:

  • 如果你真的只是想避免使用eax,那么当然可以。使用其他一些寄存器作为临时寄存器,例如 ecxedx

标签: assembly x86 nasm


【解决方案1】:
  1. 不,仅使用一条指令是无法做到这一点的。也就是说,你不能这样做:

    mov  [name], [nane]     ; invalid code!
    

    因为没有对需要两个内存操作数的MOV 指令进行编码:

    mov  mem, meg           ; non-existent instruction!
    

    MOV 唯一可用的表单是:

    mov  reg, imm           ; place immediate/constant in register
    mov  mem, imm           ; store immediate/constant in memory
    mov  reg, reg           ; copy one register to another
    mov  reg, mem           ; load value from memory into register
    mov  mem, reg           ; store value from register into memory
    

    这就是你必须使用临时寄存器的原因。

    实际上有一种方法可以使用一条指令将数据从内存中的一个位置移动到另一个位置 — MOVS。这使用 implicit 操作数,但需要一些额外的设置才能正常工作,除了它本身就是一条缓慢的指令(用微码实现),所以使用带有临时寄存器的 MOV 几乎总是更好的主意。

  2. 类型修饰符是必需的。而且,事实上,NASM 不需要它。 它无错误地组装此代码:

    mov  eax, [nane]
    mov  [name], eax
    

    请注意,如果您要包含类型修饰符(并且您总是可以,只是为了明确一点),那么它不应该放在您最初拥有它的位置。汇编器已经知道EAX 寄存器的大小是DWORD。正确的(显式)形式是:

    mov  eax, dword [nane]
    mov  dword [name], eax
    

    但是,正如我所说,这实际上不是必需的。汇编器可以判断它是在name 的地址存储一个DWORD 大小的值,因为源操作数(EAX)本身就是DWORD 大小的。

    另请参阅此答案:When should I use size directives in x86?

【讨论】:

    猜你喜欢
    • 2019-09-06
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多