不久前我涉足了组装(NASM 风格),我正在尝试再次学习它。(我知道我可以先计算字符串长度,但这是一个练习)
无论如何,我编写了这段代码来打印出一个以 null 结尾的字符串来stdout
使用sys_write
. (我打算概括一下,我现在只是在测试。)
似乎它会起作用,因为如果我i
在调用之前增加sys_write
它会打印'e'
,但如果我之后增加它,那么它会'H'
按预期打印。但是,一旦遇到: jne print_loop
,它就会产生运行时错误,错误代码为-1
。我尝试了几个跳转指令,它们都崩溃了,但是一旦我删除跳转,程序就会运行而没有任何错误。
SECTION .data
hello:
db "Hello World!/n",0
SECTION .bss
i:
resb 1
SECTION .text
global _start
_start:
mov ecx, hello
call print
mov eax, 1
mov ebx, 0
int 80h
print:
mov eax, 4
mov ebx, 1
mov edx, 1
print_loop:
push eax
mov eax, [i]
lea ecx, [ecx+eax]
pop eax
int 80h
inc dword [i]
cmp ecx, 0
jne print_loop ; if I comment this out, it runs without error.
ret
这是固定版本:
%macro print_ 1
mov eax, 4
mov ebx, 1
mov ecx, %1
call print
%endmacro
%macro exit_ 1
mov eax, 1
mov ebx, %1
int 80h
%endmacro
SECTION .data
hello:
db "Hello World!/n",0
SECTION .bss
i:
resb 1
SECTION .text
global _start
_start:
print_ hello
exit_ 0
;print code called by print_ macro
print:
push ecx
count:
inc ecx
cmp byte [ecx], 0
jne count
mov edx, ecx
pop ecx
sub edx, ecx
int 80h
ret