Assembly 汇编-如何处理寄存器

Assembly 汇编-如何处理寄存器,assembly,x86,nasm,Assembly,X86,Nasm,所以我正在尝试学习汇编(NASM)。问题是,用于装配的资源是非常基本的理论资源,而且非常稀少,我无法理解非常基本的东西。我知道汇编寄存器被用作处理器“内存”上的“变量”。但问题是,例如在这个“hello world”类型的程序中: section .text global _start ;must be declared for linker (gcc) _start: ;tell linker entry point mov edx,len

所以我正在尝试学习汇编(NASM)。问题是,用于装配的资源是非常基本的理论资源,而且非常稀少,我无法理解非常基本的东西。我知道汇编寄存器被用作处理器“内存”上的“变量”。但问题是,例如在这个“hello world”类型的程序中:

section .text
   global _start     ;must be declared for linker (gcc)
    
_start:          ;tell linker entry point
   mov  edx,len  ;message length
   mov  ecx,msg  ;message to write
   mov  ebx,1    ;file descriptor (stdout)
   mov  eax,4    ;system call number (sys_write)
   int  0x80     ;call kernel
    
   mov  eax,1    ;system call number (sys_exit)
   int  0x80     ;call kernel
    
section .data
msg db 'Hello from assembly!',0xa ;a message
len equ $ - msg  ;length of message
for(int i = 0; i < 5; i++) 
{
      printf("Hey!\n");
}
我无法理解为什么我们要保存例如
edx
上的消息长度和要在
ecx
上写入的消息,例如在tutorialspoint中,它说:

所以这里我假设,由于ECX应该有循环计数器,在一个类似C的程序中:

section .text
   global _start     ;must be declared for linker (gcc)
    
_start:          ;tell linker entry point
   mov  edx,len  ;message length
   mov  ecx,msg  ;message to write
   mov  ebx,1    ;file descriptor (stdout)
   mov  eax,4    ;system call number (sys_write)
   int  0x80     ;call kernel
    
   mov  eax,1    ;system call number (sys_exit)
   int  0x80     ;call kernel
    
section .data
msg db 'Hello from assembly!',0xa ;a message
len equ $ - msg  ;length of message
for(int i = 0; i < 5; i++) 
{
      printf("Hey!\n");
}
for(int i=0;i<5;i++)
{
printf(“嘿!\n”);
}
ECX
寄存器应包含
i
。但是在上面的程序中,我们将消息保存在
ECX

类似地,当我们想从汇编中调用C函数时,我对保存参数的位置感到困惑,但我假设,由于这更高级,如果我了解保存在哪个寄存器中的内容,我会逐渐了解在我想调用C函数的情况下会发生什么


谢谢大家!

寄存器是独立的数据存储设备,因此存储数据的位置并不重要,除非函数或指令要求您这样做

在这种情况下,Linux系统调用要求将数据存储在特定的寄存器中。
在其他情况下,这些规则更像是良好的实践:您应该遵循它们,但如果没有任何要求,则不一定要遵循它们。

寄存器是独立的数据存储设备,因此存储数据的位置并不重要,除非函数或指令要求您这样做

在这种情况下,Linux系统调用要求将数据存储在特定的寄存器中。
在其他情况下,这些规则更像是良好的实践:你应该遵循它们,但如果没有任何要求,你也不一定要遵循它们。

这些描述有点背道而驰——试图追溯解释寄存器命名。它可能会帮助您记住寄存器的其他特殊用途,否则这些用途是通用的。然而,这并不是注册名称的真正原因

英特尔处理器系列最初只有一个累加器,简称寄存器a

当后来的模型添加更多寄存器时,A之后的下一个寄存器可能被称为A2或B。因此它碰巧变成了B。在这之后,使用C和D作为另一对寄存器是“自然的”。现在我们使用的是8位CPU

在将8086设计为16位设备时,旧的8位寄存器a、B、C和D是16位的,并命名为AX、BX、CX和DX。同时,它们比8080更通用


因为它们是通用寄存器,所以它们可以用于其backronym名称以外的其他用途。例如,CX(或ECX)可以很好地存储指向字符串的指针,而不是保存循环计数。

这些描述有点像是回溯性的-试图追溯解释寄存器命名。它可能会帮助您记住寄存器的其他特殊用途,否则这些用途是通用的。然而,这并不是注册名称的真正原因

英特尔处理器系列最初只有一个累加器,简称寄存器a

当后来的模型添加更多寄存器时,A之后的下一个寄存器可能被称为A2或B。因此它碰巧变成了B。在这之后,使用C和D作为另一对寄存器是“自然的”。现在我们使用的是8位CPU

在将8086设计为16位设备时,旧的8位寄存器a、B、C和D是16位的,并命名为AX、BX、CX和DX。同时,它们比8080更通用


因为它们是通用寄存器,所以它们可以用于其backronym名称以外的其他用途。例如,CX(或ECX)可以很好地存储指向字符串的指针,而不是保存循环计数。

我曾经为这一切而挣扎,但人们没有提供帮助。我刚被称为巨魔

什么是登记册? 寄存器是处理器的一种简单数据存储器,它非常小(通常为16、32或64位),但速度非常快

它们可用于将数据或地址存储到内存中

所有不同的寄存器有什么意义? 1) 您不能使用一个寄存器来保存所有数据(除非您擅长混淆二进制内容)

2) 指令使用不同的寄存器(例如,循环指令使用计数寄存器,即CX)

内存或者硬盘呢? 数学之类的东西通常需要注册(也要吃蔬菜!)。内存比寄存器慢,您必须管理它

这个例子可能会让你感到困惑,但它就像黄金和金钱一样。黄金没有经济价值,但它是珍贵而稀有的。你可以很容易地得到钱,但它是如何运作更令人困惑


除非您需要访问文件,否则硬盘驱动器不应用于任何带有汇编的东西。

我曾经为这一切而苦苦挣扎,但人们没有提供帮助。我刚被称为巨魔

什么是登记册? 寄存器是处理器的一种简单数据存储器,它非常小(通常为16、32或64位),但速度非常快

它们可用于将数据或地址存储到内存中

所有不同的寄存器有什么意义? 1) 您不能使用一个寄存器来保存所有数据(除非您擅长混淆二进制内容)

2) 指令使用不同的寄存器(例如,循环指令使用计数寄存器,即CX)

内存或者硬盘呢? 数学之类的东西通常需要注册(也要吃蔬菜!)。内存比寄存器慢,您必须管理它

这个例子可能会让你感到困惑,但它是