x86汇编 – 打印一个给定ASCII码的字符

我是汇编程序devise新手,无法将字符打印到屏幕上。 每当我执行我的程序,我得到一个分段错误,我不知道为什么。

.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 

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

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

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

 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 ,这不是你想要的。