【发布时间】:2017-07-28 07:47:52
【问题描述】:
我正在使用以下 hello world 程序学习汇编
section .text
global _start ;must be declared for linker (ld)
_start: ;tells 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, world!', 0xa ;our string
len equ $ - msg ;length of our string
我最初的问题是字符串的长度是什么意思。它是指字符数还是内存中的长度(字节数)? 为了检查这一点,我想打印变量 len。我怎样才能做到这一点?我天真地试图定义新变量
len2 equ $ - len
然后运行
mov edx,len2 ;message length
mov ecx,len ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
尝试打印 len,但这什么也没打印。如何打印 len 表示的数字?
【问题讨论】:
-
您可能需要检查How to print a number in assembly NASM? 简短的回答是您将字符 写入
stdout。数字是十进制值,不是可以立即写入的字符串,必须将整数或无符号值转换为其字符表示,然后写入stdout。 -
出于好奇,您正在为什么操作系统编程?视窗? Unix?苹果系统?我之所以这么问,是因为除了这样的问题之外,经常有人在 SO 上提问的人正在使用错误平台的教程。
-
谢谢。我正在使用 ubuntu。出于好奇,当我尝试直接使用 stdout 打印数字时,我什么也没得到。为什么它什么都不打印,而不是打印一些废话?
-
因为 SYS_write 系统调用打印字符串而不是数字。您必须将数字转换为字符串并打印该字符串。您还可以选择使用 C 库并使用
printf之类的东西来打印数字。printf会为你完成数字到字符串的转换,否则你必须自己编写代码。 -
@JonathanLindgren:您正在传递一个数字,
SYS_write试图将其用作指针,因此它返回-EFAULT。 (对坏指针的系统调用会返回错误而不是引发 SIGSEGV。)使用调试器和/或strace。见底部the x86 tag wiki