Tôi có một nghi ngờ rất cơ bản ở đây. Tôi có hai mã C rất đơn giản và mã lắp ráp của họ:Trong assembler, tại sao việc sử dụng các thanh ghi khác nhau giữa cộng và trừ?
chương trình 1:
main()
{
int temp1, temp2, temp3;
char temp5, temp6, temp7, temp8, temp9;
temp1 = 5;
temp1 = 9 - temp1;
}
hội:
0x080483b4 <+0>: push ebp
0x080483b5 <+1>: mov ebp,esp
0x080483b7 <+3>: sub esp,0x20
0x080483ba <+6>: mov DWORD PTR [ebp-0xc],0x5
0x080483c1 <+13>: mov eax,0x9
0x080483c6 <+18>: sub eax,DWORD PTR [ebp-0xc]
0x080483c9 <+21>: mov DWORD PTR [ebp-0xc],eax
0x080483cc <+24>: leave
0x080483cd <+25>: ret
Chương trình 2:
main()
{
int temp1, temp2, temp3;
char temp5, temp6, temp7, temp8, temp9;
temp1 = 5;
temp1 = 9 + temp1;
}
hội:
0x080483b4 <+0>: push ebp
0x080483b5 <+1>: mov ebp,esp
0x080483b7 <+3>: sub esp,0x20
0x080483ba <+6>: mov DWORD PTR [ebp-0xc],0x5
0x080483c1 <+13>: add DWORD PTR [ebp-0xc],0x9
0x080483c5 <+17>: leave
0x080483c6 <+18>: ret
Tại sao trừ trường hợp phép trừ, đăng ký eax cần được sử dụng và không phải trong trường hợp bổ sung. nó không thể được như:
0x080483c1 <+13>: sub DWORD PTR [ebp-0xc],0x9
thay vì -
0x080483c1 <+13>: mov eax,0x9
0x080483c6 <+18>: sub eax,DWORD PTR [ebp-0xc]
không. Trong mã C, bạn trừ một biến từ 9. Trong hội đồng của bạn, bạn nên trừ một đăng ký từ 9, đó là của mã lắp ráp và không phụ DWORD PTR [ebp-0xc], 0x9 . Trên mã lắp ráp, eax được trừ với 5. Trong tiền đề của bạn, bạn sẽ trừ 5 bằng 9. –
bạn đã biên dịch với các tối ưu hóa được bật chưa? – ninjalj
@ninjalj: Rõ ràng là không. Bởi vì nếu không thì toàn bộ điều chắc chắn sẽ được tối ưu hóa thành một 'lần nữa'. – celtschk