对于我的生活,我无法弄清楚为什么这不会打印到屏幕上。不会崩溃或出现故障,只是退出。是的,我是新人,事实上正在寻找导师,如果有人能够帮助他们,那将是非常感激的。
; Hello World in nasm
;
; Intel Linux bt 2.6.39.4 #1 SMP x86_64 GNU/Linux
; NASM version 2.07
; ld 2.20.1-system.20100303
;
; Compile to 32bit with debugging symbols:
; nasm -g -f elf32 -F dwarf string-w.asm
; ld -g -melf_i386 -o string-w string-w.o
; file string-w.asm
[section .data]
msg db "Hello World",0xa,0x0
len equ $ - msg
[section .bss]
[section .text]
global _start
_start:
push dword len
push dword msg
push dword 1 ; Stdout
mov eax,0x4 ; write
int 0x80
ret
add esp,12
push dword 0
mov eax, 0x1 ; exit
int 0x80
再一次,非常感谢任何帮助,如果有人在找学生,我愿意做志愿者。
答案 0 :(得分:1)
你仍然可以使用int 80,你的问题是你使用它错了。 您不会将参数压入堆栈,而是将参数传递到寄存器中。这些链接将显示哪些调用使用什么寄存器: Linux System Call Table Linux System call Reference
答案 1 :(得分:0)
好吧,基本上int 0x80已弃用,请改用SYSENTER。
Related thread以及您正在尝试做的一个示例...虽然使用稍微不同的汇编语法编写。
很久以前http://articles.manugarg.com/systemcallinlinux2_6.html
谷歌周围的sysenter ...或sysenter vs int 0x80。
答案 2 :(得分:0)
你所拥有的东西看起来几乎像BSD代码 - BSD在堆栈上推送参数并使用int 80h。 Linux系统调用接受寄存器中的参数,ebx,ecx,edx(这就是你所需要的),esi,edi ......甚至可能是ebp。您不需要ret
或清理堆栈。
mov edx, len
mov ecx, msg
mov ebx, 1 ; file descriptor for stdout
mov eax, 4 ; sys_write call number (for 32-bit)
int 80h
mov ebx, 0 ; exit code
mov eax, 1 ; sys_exit call number
int 80h
mov edx, len
mov ecx, msg
mov ebx, 1 ; file descriptor for stdout
mov eax, 4 ; sys_write call number (for 32-bit)
int 80h
mov ebx, 0 ; exit code
mov eax, 1 ; sys_exit call number
int 80h
从C库中调用(有些人声称更可取)...
write()
标签 - 它未被调用,它被跳转到了!; nasm -f elf32 myprog.asm
; ld -o myprog myprog.o -I/lib/ld-linux.so.2 -lc -melf_i386
global _start
extern write
section .data
msg db "Hello World", 10
len equ $ - msg
section .text
_start:
push len
push msg
push 1
call write
add esp, 4 * 3
mov ebx, 0
mov eax, 1
int 80h
You'll have to link it a little differently. You've got the right idea... in fact you've got two right ideas, you've just got 'em mixed up! :)
最佳, 弗兰克