我决定学习汇编。我觉得我有大麻烦了。(我使用的是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系统调用约定也适用于其他函数。";意向含义";不考虑寄存器的。ebx
、ecx
、edx
、esi
、edi
和ebp
仅用作任何系统调用的通用参数槽。此外,在大多数情况下,寄存器的含义很少被记住。据我所知,只有ecx
在某些情况下仍被用作计数器,eax
有时被用作mul
等指令的累加器(当然,esp
在push
/pop
中被用作堆栈指针(。