汇编语言定义整数变量



我决定学习汇编。我觉得我有大麻烦了。(我使用的是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。在屏幕上打印内容所需的系统调用对于eax是4。例如,如何将整数值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

谢谢。

例如,如何将整数值4放入eax寄存器?

例如:

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

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

如何将整数值定义为位?或者是六面体。示例

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

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

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

mov ecx, character_x
mov edx, 1

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

ecx获取字符的地址,而不是";字符本身";。至于实际的问题,因为x86系统调用约定也适用于其他函数。";意向含义";不考虑寄存器的。ebxecxedxesiediebp仅用作任何系统调用的通用参数槽。此外,在大多数情况下,寄存器的含义很少被记住。据我所知,只有ecx在某些情况下仍被用作计数器,eax有时被用作mul等指令的累加器(当然,esppush/pop中被用作堆栈指针(。

最新更新