FASM で 32 ビットの符号なし整数を STDOUT に出力する単純なサブルーチンを作成しています。これは私が思いついたものです:
format elf
public uprint
section ".text" executable
uprint:
push ebx
push ecx
push edx
push esi
mov ebx, 10
mov ecx, buf + 11
xor esi, esi
do:
dec ecx
xor edx, edx
div ebx
add dl, 0x30
mov [ecx], dl
inc esi
test eax, 0
jnz do
mov eax, 4
mov ebx, 1
mov edx, esi
int 0x80
pop esi
pop edx
pop ecx
pop ebx
ret
section ".data" writeable
buf rb 11
次に、上記のサブルーチンが適切に機能するかどうかをテストする別のプログラムを作成しました。
format elf
extrn uprint
public _start
section ".text" executable
_start:
mov eax, 1337
call uprint
mov eax, 4
mov ebx, 1
mov ecx, newline
mov edx, 1
int 0x80
mov eax, 1
xor ebx, ebx
int 0x80
section ".data"
newline db 0x0A
これらの両方のプログラムを対応するオブジェクト ファイルにコンパイルし、それらをリンクして実行可能ファイルを作成しました。
ただし、プログラムを実行すると、の7
代わりに表示されるだけでし1337
た。結局のところ、数字自体に関係なく、数字の最後の桁のみが表示されます。
uprint
私のサブルーチンが正しいので、これは奇妙です。実際、これらの両方のプログラムを 1 つのプログラムに結合すると、1337
正しく表示されます。
私は何を間違っていますか?