-1

アセンブリの問題を解決しようとしていて、なんとかコードを記述できましたが、結果を表示しているときに奇妙な出力が得られます。3 つの数字の 2 乗を足すことになっていましたが、そのうちの 1 つがマイナスです。これが私のコードです。これは、アセンブル、リンク、および実行に使用するものです。ありがとう!

コンパイルと実行の手順:

nasm -g -f elf lab1.asm
gcc -o lab1 lab1.o
./lab

SECTION .data
message:    db  "Hello, this is Iva.", 0AH
anothermsg  db  "The sum of the numbers %d, %d and %d is %d", 0AH
len:        equ $-message
variable1:  dw  7
variable2:  dw  -11
variable3:  dw  19
SECTION .text
    extern printf
    global main
main:   

mov eax, dword [variable1]
movzx ebx, al
mov eax, ebx

imul eax
push eax



mov eax, dword [variable2]
movzx ebx,al
mov eax,ebx

imul eax
push eax

mov eax, dword [variable3]
movzx ebx,al
mov eax,ebx

imul eax
pop ebx
add eax,ebx
pop ebx
add eax,ebx

push eax

push dword [variable3]
push dword [variable2]
push dword [variable1]
push anothermsg


call printf

mov eax,1
mov ebx,0
int 80h
4

1 に答える 1

0

いくつかの間違いが見られます。

まず、printf()ASCIIZ 形式の文字列を受け入れます (すべての C 文字列は ASCIIZ、IOW、NUL で終了します)。anothermsgただし、 はゼロバイトで終わりません。明示的に追加する必要があります。

次に、整数変数を 16 ビット ( dw= 16 ビット) として宣言しますが、メモリからそれらを 32 ビットとしてフェッチします (例: mov eax, dword [variable1]= dword32 ビット)。これはうまくいくかもしれませんが、ほとんど意味がありません。dd整数変数を 32 ビット ( = 32 ビット)として宣言するだけです。

3番目に、私には不明な理由で(おそらく、以前の問題のために)、32ビット(または解釈方法によっては16ビット)の値を8ビットに切り捨てています。movzxこれにより、平方の計算が行われます-11の間違い。

ほら、-11が次のように保存されvariable2ています:

1111111111110101 (binary)

これらの 2 つの指示の後:

mov eax, dword [variable2]
movzx ebx,al

あなたは得る:

eax = ????????????????1111111111110101 (??? are the memory contents right after variable2)
ebx = 00000000000000000000000011110101 (245 decimal)

次に、これらの 2 つの指示の後:

mov eax,ebx
imul eax

あなたは得る:

eax = 00000000000000001110101001111001 (60025 decimal)

movsx ebx,alの代わりに実行すると、次のmovzx ebx,alようになります。

eax = ????????????????1111111111110101 (??? are the memory contents right after variable2)
ebx = 11111111111111111111111111110101 (-11 decimal)

次に、これらの 2 つの指示の後:

mov eax,ebx
imul eax

ついに:

eax = 00000000000000000000000001111001 (121 decimal)
于 2013-02-05T04:37:43.470 に答える