我不熟悉任何类型的程序集编程,因为我听说用于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个参数都是如此!
我是怎么做到的?如何让它获得预期的结果呢?
答案 0 :(得分:0)
而不是
test ebx,2
你想要
cmp ebx,2
test
在参数之间执行按位AND并抛出结果,除了设置标志。因此,特别是如果两个参数在匹配的位置没有1位,则将设置ZF。 (在您的特定情况下,这可以将ZF设置为ebx
的倒数第二位的补码。
相反cmp
减去其参数,并在设置标志后抛弃结果。在这种情况下,如果两个参数相等,则将设置ZF。