少し前に Assembly (NASM フレーバー) に手を出しましたが、もう一度学ぼうとしています。(最初に文字列の長さを数えることができることは知っていますが、それは演習です)
とにかく、私はこのコードを書いて、null で終了する文字列をstdout
usingに出力し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