TASM(winXP上)で私のasmコードをコンパイルするのに使用しましたが、今はNASM(Linux上)を使用しているのでいくつか問題がありました。このスニペットは、私が何をしようとしている示していますアセンブリー(またはNASM)厄介な問題
(gdb) list 35
30 xor ecx,ecx # ecx is a counter
31 mov bl, ' ' # this is what I'm looking for
32 count_spaces:
33 mov al,[esi] # grab a char
34 jz spaces_counted # is this the end?
35 inc esi # next char
36 cmp al,bl # found one?
37 jne count_spaces # nope, loop
38 inc ecx # yep, inc counter
39 jmp count_spaces # and loop
これは、私には正しいようしかし:
Breakpoint 1, main() at project1.asm:30
30 xor ecx,ecx
(gdb) display (char) $al
1: (char) $al = 0 '\000'
(gdb) display (char) $bl
2: (char) $bl = 0 '\000'
(gdb) next
31 mov bl, ' '
2: (char) $bl = 0 '\000'
1: (char) $al = 0 '\000'
(gdb)
count_spaces() at project1.asm:33
33 mov al,[esi]
2: (char) $bl = 0 '\000'
1: (char) $al = 0 '\000'
(gdb)
al
とbl
が変更されなかった理由を私は理解できません。
私のコードはであると確信していますが、私はいくつかのNASMのオプションを逃したと思いますか? はところで、私はコンパイル後
nasm -f elf -l project1.lst -o project1.o -i../include/ -g project1.asm
でコンパイルされた、私は出力を分解して得た:
80483ec: 31 c9 xor %ecx,%ecx
80483ee: bb 20 00 00 00 mov $0x20,%ebx
080483f3 <count_spaces>:
80483f3: 8b 06 mov (%esi),%eax
80483f5: 3d 00 00 00 00 cmp $0x0,%eax
80483fa: 74 0b je 8048407 <spaces_counted>
80483fc: 46 inc %esi
80483fd: 39 d8 cmp %ebx,%eax
80483ff: 75 f2 jne 80483f3 <count_spaces>
8048401: 41 inc %ecx
8048402: e9 ec ff ff ff jmp 80483f3 <count_spaces>
変数名を理解するためにイタリア語(おそらく)を知る必要がありますか? –
@アーメンTsirunyan:アップ、私は完全に忘れてしまった。 :)編集 – BlackBear
gdbは__before__命令を実行するので、表示された命令を実行するには 'stepi'または 'next'を実行する必要があることに注意してください。それでもなお、blの値は変更されているはずです。 – BatchyX