汇编语言定义整型变量

Assembly language define integer variable

我决定学习汇编。我觉得我有大麻烦了。 (我正在使用 NASM )

section .data
    character_x DB 'x'

section .text
    global _start

_start:
    mov eax,4
    mov ebx,1
    mov ecx, character_x
    mov edx,1
    int 0x80

    mov eax,1
    int 0x80

上面的代码打印字符 x。在屏幕上打印内容所需的系统调用是 4 for eax。比如我如何把4这个整数值放到eax寄存器中?

例如:

    mov eax, 4h
    ; OR
    mov eax, '4'

以及如何将整数值定义为位?或十六进制。 例子

    integer_value1 DB 00100010 ; Decimal = 34
    integer_value2 DD AF3  ; Decimal = 2803

我想再问一个问题,就像上面其他愚蠢的问题一样,

cx寄存器为计数寄存器。 dx寄存器是数据寄存器。

    mov ecx, character_x
    mov edx, 1

为什么ecx寄存器得到的是字符本身?为什么edx寄存器取字符的长度?

我认为代码应该像下面这样

    mov ecx, 1
    mov edx, character_x

谢谢。

For example, how do I put the integer value of 4 in the eax register?

for example:

mov eax, 4h
; OR
mov eax, '4'

第一个将数字 4 移动到 eax,这是 write 系统调用的正确数字。第二个将数字 52(字符 '4' 的 ASCII 代码)移动到 eax,这将导致在您执行 int 80h 时调用 umount2 系统调用。所以我想你想要第一个。

And How do I define an integer value as a bit? Or hexadimal. Example

integer_value1 DB 00100010 ; Decimal = 34
integer_value2 DD AF3  ; Decimal = 2803

NASM 手册清楚地说明了如何使用二进制和十六进制文字 here。要使用二进制文字,只需添加一个 0b 前缀,后跟一个二进制数字(尽管这不是唯一的方法)。对于十六进制,添加一个 0x 前缀,后跟一个十六进制数字(同样,这不是编写十六进制文字的唯一方法)。要查看 NASM 支持的所有文字,请查看 link.

cx register is Count Register. dx register is Data Register.

mov ecx, character_x
mov edx, 1

Why ecx register got the character itself? And Why did the edx register take the length of the character?

ecx 获取字符的地址,而不是“字符本身”。至于实际问题,因为 x86 系统调用调用约定也适用于其他函数。不考虑寄存器的“预期含义”。 ebxecxedxesiediebp 仅用作 any[ 的通用参数槽=45=]系统调用。此外,在大多数情况下,很少记住寄存器的含义。据我所知,只有 ecx 在某些情况下仍用作计数器,而 eax 有时用作 mul 等指令的累加器(当然还有 esp用作push/pop).

中的堆栈指针