汇编语言定义整型变量
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 系统调用调用约定也适用于其他函数。不考虑寄存器的“预期含义”。 ebx
、ecx
、edx
、esi
、edi
和 ebp
仅用作 any[ 的通用参数槽=45=]系统调用。此外,在大多数情况下,很少记住寄存器的含义。据我所知,只有 ecx
在某些情况下仍用作计数器,而 eax
有时用作 mul
等指令的累加器(当然还有 esp
用作push
/pop
).
中的堆栈指针
我决定学习汇编。我觉得我有大麻烦了。 (我正在使用 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 系统调用调用约定也适用于其他函数。不考虑寄存器的“预期含义”。 ebx
、ecx
、edx
、esi
、edi
和 ebp
仅用作 any[ 的通用参数槽=45=]系统调用。此外,在大多数情况下,很少记住寄存器的含义。据我所知,只有 ecx
在某些情况下仍用作计数器,而 eax
有时用作 mul
等指令的累加器(当然还有 esp
用作push
/pop
).