2

我是汇编编程的新手,无法在屏幕上打印字符。每次我执行我的程序时,我都会遇到分段错误,我不知道为什么。

.section .data
  A:
    .long  65  # ascii code for 'A'

.section .text
.globl _start

_start:
 movl $1, %edx # length of character to print, 1
 movl  A, %ecx # what I want printed
 movl $1, %ebx # file descriptor for STDOUT
 movl $4, %eax # syscall number for sys_write

 int $0x80     # calls kernel

 movl $0, %ebx # return status
 movl $1, %eax # syscall number for sys_exit

 int $0x80     # calls kernel

这些是我用来构建的命令 (我的文件名为 write.s)

as write.s -o write.o
ld write.o -o write

这不是打印字符的正确方法吗?任何帮助,将不胜感激。

4

1 回答 1

2
movl A, %ecx

意思是:将标签 A 的地址处的值复制到%ecx. 正确的指令是:

movl $A, %ecx

或者

leal A, %ecx

在这些情况下,您可以使用 GDB 进行调试(请注意,您必须使用-g标志进行汇编才能获取调试信息):

$ as -g write.s -o write.o
$ ld write.o -o write
$ gdb write
GNU gdb (GDB) 7.5
   [.. snip ..]
(gdb) b test.s:13
Breakpoint 1 at 0x4000c6: file test.s, line 13.
(gdb) run
Starting program: /home/niklas/tmp/asm/write 

Breakpoint 1, _start () at test.s:13
13   int $0x80     # calls kernel
(gdb) info registers ecx
ecx            0x41 65

如您所见,%ecx具有整数值65,这不是您想要的。


如果你运行strace ./write,它将解码系统调用参数并为你返回值。当你传递一个错误的指针时,你会看到它write()只是返回-EFAULT而不做任何其他事情。

于 2012-08-31T18:20:38.900 回答