Articles of nasm

程序集x86(32位),调用NR_creat(8)损坏文件名存储

程序集x86(32位),调用NR_creat(8)损坏文件名存储 所有的,我已经拉出我的头发,试图确定如何为文件名保留的存储空间被调用文件creat (NR_creat 8)损坏。 汇编程序是nasm ,代码是在x86_64框中编译并运行的32位代码。 例程是一个简单的代码,它从程序参数argv[1]中获取文件名,然后使用该名称创build一个具有0644八进制许可权的文件。将文件写入,然后程序退出。 文件操作工作,问题是我失去了调用文件fnbuf时存储在fnbuf的文件名。 名为fnbuf的保留存储是32字节,在简单的mov [fnbuf], ebx操作中用argv[1]填充。 fnbuf的信息fnbuf是正常的,直到文件被创build,之后, fnbuf的信息被破坏,地址被改变。 (所有其他存储的信息都很好)。 要保留文件名,我已经把它推到了堆栈上(这在文件创build后工作正常)我不明白为什么fnbuf的信息被破坏,需要帮助。 相关代码如下,以及简要的gdb输出( 完整代码如下 )。 section .data buflen equ 32 section .bss fd_out resb 1 fd_in resb 1 fnbuf resb buflen section .text global _start _start: ; linker entry point ; get the file_name from stdin (argv[1]) add esp, 8 ; skip […]

nasm上的execvp用法

我正在学习NASM,可能是linux系统调用。 我试图复制一个进程并调用linux实用程序,但与execvp有同样的麻烦,我不知道如何传递参数到它。 我如何做到这一点? SECTION .data cmd_cat: db '/bin/cat', 0 arg_cat: db 'log.txt', 0 cat: dd cmd_cat, arg_cat, 0 fd1: dw 0, 0 pipe_error_message: db 'pipe error occured', 0xa pipe_error_message_length: equ $ – pipe_error_message fork_error_message: db 'fork error occured', 0xa fork_error_message_length: equ $ – fork_error_message SECTION .text GLOBAL _start: _start: ;call pipe(fd1) ;42 – pipe system […]

Linux(64位),nasm和gdb

我正在寻找另一个线程,但没有运气。 我的问题可能很简单,但令我感到沮丧。 我正在编译64位Ubuntu 11.04上的两个文件: nasm -f elf64 -g file64.asm gcc -g -o file file.c file64.o 我正在用gdbdebugging生成的可执行文件。 用C部分一切正常,但汇编语言源代码对debugging器是“不可见的”。 我得到的输出如下所示: (gdb) step Single stepping until exit from function line, which has no line number information. 0x0000000000400962 in convert () 我的快速调查: objdump –source file64.o 显示汇编源代码(和行信息)包含在文件中。 为什么我在debugging会话中看不到它? 我做错了什么? 我必须说,移到64位Ubuntu后,出现这些问题。 在32位的Linux工作(像它应该)。 这对我来说只是一种乐趣,但无论如何,这是非常令人沮丧的。

文件存在,但“没有这样的文件或目录”

[root@GoodiesArch ASM]# ls EXEC* file.sh* this.asm [root@GoodiesArch ASM]# ./EXEC bash: ./EXEC: No such file or directory [root@GoodiesArch ASM]# 我有一个汇编文件,我编译,它不会看到它作为一个实际的文件。 不是我用[TAB]自动填充来填写文件名。 它检测到它,但它说“没有这样的文件或目录” 这是我用来编译它。 我有一个x64位的机器,正在运行32位的asm代码: nasm -f elf32 -o tmp.o this.asm ld -s -lc -L /usr/lib32/ -m elf_i386 -o EXEC tmp.o 它显示在ls和tabb中的文件,但是当我点击进入,它什么也没有显示。 更新:好的。 当我不通过ASM文件调用C函数时,我可以编译它并运行,没有错误,使用这个: nasm -f elf32 -o tmp.o this.asm ld -s -m elf_i386 -o EXEC tmp.o

Linux程序集; bss节内存初始化为0?

在testing中,我运行在我的程序的BSS部分的内存始终被初始化为零,然后我写任何东西。 这是否是巧合,还是系统在将这些内存页面交给我之前“清理”这些内存页面? 我正在使用Ubuntu上的nasm汇编程序(如果这可能有所不同)。

linux nasm命令行参数为整数

我一直试图解决这个问题,终于在这里发帖寻求帮助。 这个练习对我来说纯粹是学术的,但是到了这个地步,我只是需要明白为什么这不起作用或者我做错了什么。 section .text global _start _start: pop eax pop ebx pop ecx _exit: mov eax, 1 mov ebx, 0 int 0x80 编译/链接: $ nasm -f elf -o test.o test.asm $ gcc -o test test.o 在gdb中使用参数“5”运行它: $ gdb test … (gdb) b _exit Breakpoint 1 at 0x8048063 (gdb) r 5 Starting program: /home/rich/asm/test 5 Breakpoint […]

缺lessgdb和nasm的debugging信息

我有一个简单的汇编程序,下面的makefile: all : calc calc : calc.o gcc -m32 -g -o calc calc.o calc.o : calc.s nasm -f elf -g -F stabs calc.s 我尝试使用gdb进行debugging,但总是说: 单步执行,直到退出函数asc2int,没有行号信息。 我尝试了很多解决scheme,包括-F dwarf但没有一个-F dwarf 。 你能帮我解决这个问题吗?

NASM参数的长度

我正在编写一个简单的程序来显示用户提供的名称。 结果是我应该可以input命令并获得预期的结果。 命令 ./hello John 结果 Hello, John. 然而,当程序转到显示名称时,它不会。 我相信这与计算论证的长度有关。 请大家看看我的代码,告诉我你的想法? ; hello.asm ; ; Assemble: nasm -f elf hello.asm ; Link: ld -o hello hello.o ; Run: ./hello <name> section .data period: db ".", 10 periodLen: equ $-period helloMsg: db "Hello, " helloMsgLen: equ $-helloMsg usageMsg: db "Usage: hello <name>", 10 usageMsgLen: equ $-usageMsg […]

这个程序集如何处理不会崩溃?

我有这个linux nasm代码在这里不会崩溃。 在printString结尾的ret 80指令不应该这个程序崩溃? bits 32 section .data hello: db 'Hello Linux assembly!!!!!!!!!!!!!!!!!!!',10,0 helloLen: equ $-hello anotherString db "hello im another string!!!!",10,0 anotherStringlen equ $-anotherString section .text global _start _start: push hello push helloLen call printString ;;;; should i pop the two paramters I pushed? ;;;; does the ret instruction do it for me? push […]

在linux下混合编程和C语言

只有两个文件, main.c和kernel.asm ,我试图用NASM和GCC kernel.asm一个程序。 内容如下: main.c中 #include <stdio.h> void Print_String() { printf("Hello World!\n"); } kernle.asm extern Print_String [section .text] global _start _start: call Print_String 编译和链接: nasm -f elf -o kernel.o kernel.asm gcc -c -o main.o main.c ld -s -lc -o final kernel.o main.o 然后我运行final文件: ./final ,但结果令人沮丧: bash: ./final: No such file or directory 但是,当前目录确实有文件final的命令ls ,它显示: […]