tôi viết một chức năng asm trong Delphi 7 nhưng nó biến đổi mã của tôi để cái gì khác:Nhãn Delphi và sự kỳ quặc?
function f(x: Cardinal): Cardinal; register;
label err;
asm
not eax
mov edx,eax
shr edx, 1
and eax, edx
bsf ecx, eax
jz err
mov eax, 1
shl eax, cl
mov edx, eax
add edx, edx
or eax, edx
ret
err:
xor eax, eax
end;
// compiled version
f:
push ebx // !!!
not eax
mov edx,eax
shr edx, 1
and eax, edx
bsf ecx, eax
jz +$0e
mov eax, 1
shl eax, cl
mov edx, eax
add edx, edx
or eax, edx
ret
err:
xor eax, eax
mov eax, ebx // !!!
pop ebx // !!!
ret
// the almost equivalent without asm
function f(x: Cardinal): Cardinal;
var
c: Cardinal;
begin
x := not x;
x := x and x shr 1;
if x <> 0 then
begin
c := bsf(x); // bitscanforward
x := 1 shl c;
Result := x or (x shl 1)
end
else
Result := 0;
end;
Tại sao nó tạo push ebx
và pop ebx
? Và tại sao nó làm mov eax, ebx
?
Dường như nó tạo khung ngăn xếp một phần vì mov eax, ebx
.
kiểm tra đơn giản này tạo mov eax, edx
nhưng không tạo ra rằng khung stack:
function asmtest(x: Cardinal): Cardinal; register;
label err;
asm
not eax
and eax, 1
jz err
ret
err:
xor eax, eax
end;
// compiled
asmtest:
not eax
and eax, $01
jz +$01
ret
xor eax, eax
mov eax, edx // !!!
ret
Dường như nó có cái gì để làm với label err
. Nếu tôi loại bỏ điều đó, tôi không nhận được phần mov eax, *
.
Tại sao điều này lại xảy ra?
Đã tạo báo cáo lỗi trên Quality Central.
xin vui lòng báo cáo này như là một lỗi tại http://qc.embarcadero.com/wc/qcmain.aspx –
@Jeroen chắc chắn. không có prob ... – Egon
Bạn đã hỏi một số câu hỏi "tại sao" ở đây, nhưng không có câu hỏi nào được trả lời bằng câu trả lời bạn đã chấp nhận. Dường như bạn thực sự chỉ muốn biết làm thế nào để nhảy đến một hướng dẫn mới trong trình biên dịch Delphi mà không quan tâm đến lý do tại sao nỗ lực của riêng bạn thất bại. Điều đó có chính xác không? –