【发布时间】:2014-01-24 23:43:00
【问题描述】:
以下是一本书(Introduction to 64 Bit Intel Assembly Language Programming for Linux,Seyfarth,2012 年)第 9 章中的程序。错误(在 gdb 中)是:
程序收到信号SIGSEGV,分段错误。 0x00007ffff7aa10a5 in __printf_size (fp=0x400400, info=0x0, args=) 在 printf_size.c:199 199 printf_size.c: 没有这样的文件或目录。
直到本章,我成功地使用了以下内容来“生成一个目标文件”,正如推荐的那样,
yasm -f elf64 -g dwarf2 -l exit.lst exit.asm
然后,
ld -o prgm prgm.o
这是从书中复制的程序(l 10 push rbp;我首先rem'd ;但结果相同):
segment .text
global main
extern printf
; void print_max ( long a, long b )
; {
a equ 0
b equ 8
print_max:
push rbp; ;normal stack frame
mov rbp, rsp
; leave space for a, b and max
sub rsp, 32
; int max;
max equ 16
mov [rsp+a], rdi ; save a
mov [rsp+b], rsi ; save b
; max = a;
mov [rsp+max], rdi
; if ( b > max ) max = b;
cmp rsi, rdi
jng skip
mov [rsp+max], rsi
skip:
; printf ( "max(%1d,%1d ) = %1d\n",
; a, b, max );
segment .data
fmt db 'max(%1d,%1d) = %1d',0xa,0
segment .text
lea rdi, [fmt]
mov rsi, [rsp+a]
mov rdx, [rsp+b]
mov rcx, [rsp+max]
call printf
; }
leave
ret
main:
push rbp
mov rbp, rsp
; print_max ( 100, 200 );
mov rdi, 100 ;first parameter
mov rsi, 200 ;second parameter
call print_max
xor eax, eax ;to return 0
leave
ret
在与本章中的前一个程序(“Hello World”示例)发生类似的分段错误之后,我使用了
gcc -o prgm prgm.o
在这个程序之前一直有效。
【问题讨论】:
-
那些
%1d(一个d)格式说明符应该是%ld(ell d)吗? -
@mbratch 是的,看起来是这样。 Kindle 非常温和地区分了 ell 和 one,尽管我应该注意到这一点。谢谢你。当格式说明符被替换为long时,在原始程序中,如果没有按照Gunner的建议进行修改,仍然会发生分段错误。
标签: linux assembly 64-bit yasm