『阿男教你玩汇编』*20*nasm与yasm的label

视频: 『阿男教你玩汇编』*20*nasm与yasm的label

nasm与yasm都支持global label与local label。其中local label的名字用'.'来开始。不是local label的则为global label。下面这段代码展示了两种label:

	segment .text
	global _start
_start:
	nop
label1:
	nop
	jmp .foo
	.foo:
	nop
label2:
	nop
	jmp .foo
	.foo:
	nop
_exit:
	mov eax, 1		; exit syscall
	mov ebx, 0		; the status value to return
	int 0x80		; execute system call


其中'label1'和'label2'是global label,两个'.foo'是local label。我们注意到两个local label的名字相同,但是这样没有关系,因为它们“从属于”它们各自上方的global label。因此“label1"里面的"jmp .foo"和"label2"里面的"jmp .foo"会跳转到各自的".foo"当中。

我们可以编译上面的代码:

[weli@fedora asm]$ yasm -f elf64 -g dwarf2 -l label.lst label.asm
[weli@fedora asm]$ ld label.o -o label


然后使用gdb验证:



可以看到两个jmp各自的跳转地址对应各自的".foo"地址。实际上,yasm和nasm在编译代码后,会把local label加上global label的前缀,我们可以在上面gdb的调试过程中看到"label1.foo"和"label2.foo"。也可以使用nm指令验证这点:

[weli@fedora asm]$ nm label
0000000000600095 T __bss_start
0000000000600095 T _edata
0000000000600098 T _end
0000000000400089 t _exit
0000000000400080 T _start
0000000000400081 t label1
0000000000400084 t label1.foo
0000000000400085 t label2
0000000000400088 t label2.foo


因此实际上local label是不重名的。

你可能感兴趣的:(linux,汇编,gdb,assembly,Yasm)