Linux组装;参数列表变得混乱

时间:2011-08-20 19:39:04

标签: file-io command-line-arguments nasm

我不熟悉任何类型的程序集编程,因为我听说用于Linux的NASM类型程序集比基于DOS的程序集相对简单,所以我决定尝试一下。

这是我迄今为止的计划:

section .data
    opening:    db  'Opening file...',10
    openingLen: equ $-opening
    opened:     db  'File opened.',10
    openedLen:  equ $-opened
    bad_params: db  'Usage: writeFile filename.ext',10
    bad_paramsLen:  equ $-bad_params
    not_opened: db  'Unable to open file.  Halted.',10
    not_openedLen:  equ $-not_opened
    hello:      db  'Hello, this is written to a file'
    helloLen:   equ $-hello
    success:    db  'Successfully wrote to file.',10
    successLen: equ $-success

section .bss
    file:       resd    1

section .text
    global _start:

_start:
    pop ebx             ; pop number of params
    test ebx,2          ; make sure there are only 2
    jne bad_param_list
    pop ebx

    mov eax,4           ; write out opening file msg
    mov ebx,1
    mov ecx,opening
    mov edx,openingLen
    int 80h

    mov eax,5           ; open file
    pop ebx
    mov ecx,64 
    mov edx,777o            ; permissions of file
    int 80h
    mov dword [file],eax

    test dword [file],0
    jle bad_open

    mov eax,4           ; write successful open message
    mov ebx,1
    mov ecx,opened
    mov edx,openedLen
    int 80h

    mov ebx,file            ; write to file (4 already in eax)
    mov ecx,hello
    mov edx,helloLen
    int 80h

    mov eax,6           ; close file
    mov ebx,file
    int 80h

    mov eax,4           ; write successfully written msg
    mov ebx,1
    mov ecx,success
    mov edx,successLen
    int 80h

    mov eax,1           ; exit
    mov ebx,0
    int 80h

bad_param_list:
    mov eax,4           ; write that params are bad
    mov ebx,1
    mov ecx,bad_params
    mov edx,bad_paramsLen
    int 80h

    mov eax,1           ; exit with code 1
    mov ebx,1
    int 80h

bad_open:
    mov eax,4           ; write that we couldn't open the file
    mov ebx,1
    mov ecx,not_opened
    mov edx,not_openedLen
    int 80h

    mov eax,1           ; exit with code 2
    mov ebx,2
    int 80h

目标是在没有库函数的情况下将文本字符串写入文件;我只使用Linux内核。我在这里和那里丢失括号时遇到了一些问题,以及你期望从装配到装配的所有其他错误,但我认为这现在大部分都在控制之中。

这是我的问题:据我所知,该程序的前四行应弹出堆栈中的参数数量,如果不只有一个参数(程序名称除外),则跳转到bad_param_list ,并将程序名称弹出堆栈。

但事实并非如此。这是一些示例I / O,为了清晰起见重新格式化:

$./writeFile
Opening file...
Unable to open file.  Halted.

$./writeFile x
Usage:  writeFile filename.ext

$./writeFile x x
Usage:  writeFile filename.ext

$./writeFile x x x
Opening file...
Unable to open file.  Halted.

$./writeFile x x x x
Opening file...
Unable to open file.  Halted.

$./writeFile x x x x x
Usage:  writeFile filename.ext

$./writeFile x x x x x x
Usage:  writeFile filename.ext

我注意到,如果你拿参数的数量,包括程序的名称,除以2,并丢弃小数,如果答案是奇数,你将得到我的使用错误,但如果答案是均匀的,你将无法打开错误。直到至少10个参数都是如此!

我是怎么做到的?如何让它获得预期的结果呢?

1 个答案:

答案 0 :(得分:0)

而不是

test ebx,2

你想要

cmp ebx,2

test在参数之间执行按位AND并抛出结果,除了设置标志。因此,特别是如果两个参数在匹配的位置没有1位,则将设置ZF。 (在您的特定情况下,这可以将ZF设置为ebx的倒数第二位的补码。

相反cmp 减去其参数,并在设置标志后抛弃结果。在这种情况下,如果两个参数相等,则将设置ZF。