Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: ½Ð°Ý"«ü¼Ð"¬O¤°»òªF¦è

0 views
Skip to first unread message

妙處難與君盡說

unread,
Sep 5, 2004, 11:04:21 AM9/5/04
to
※ 引述《Fr...@we.are.the.world (FreeZ)》之銘言:
> > edwin...@bbs.badcow.com.tw (good job) wrote:
> > 他這樣的用意何在???
> 就是 call function (它) 時, 丟一個位址給它,
> 叫它去那個位址取資料.
> 大多數的譯器, 對於字串、陣列等, 都會大多自動
> 轉成指標的參數傳遞.
> 但對於整數, 就不會了. 譯器讓你有選擇, 你要
> 用丟指標呢? 還是要直接丟值呢?

請問那指標就是指call by reference的意思嘛?
--
[1;32m※ Origin: [33m台灣科大電子站 [37m<bbs.et.ntust.edu.tw> [m
[1;31m◆ From: [36m210.64.15.170 [m

FreeZ

unread,
Sep 5, 2004, 2:46:28 PM9/5/04
to
> AUTOS...@bbs.et.ntust.edu.tw (妙處難與君盡說) wrote:
>> 引述《Fr...@we.are.the.world (FreeZ)》之銘言:

>> 但對於整數, 就不會了. 譯器讓你有選擇, 你要
>> 用丟指標呢? 還是要直接丟值呢?
> 請問那指標就是指call by reference的意思嘛?

當你要指定 call by address/reference, 那就可
以用 "指標符" 來描述指定之. 以避免高階譯器可
能的自作聰明, 而譯成非你所需的那種參數傳遞方
式.

在大多數的高階譯器中, 當你沒指定時, 若傳整數
變數給它 (某 function ) 時, 大多會把該變數中
的數值丟過去, 而不是丟變數的位址.

一般說來, 丟值 (call by value) 的速度比較快
些, 因為它只要把參數拿起來, 就可以直接處理了
. 而非拿到了位址後, 再依位址去拿那個值.

但有時候, 光丟值時, 在運用上不是很方便. 如果
你要它去修改某變數中的內容, 若只把數值丟給它
, 它就無從得知那個變數空間是位於何處.

================
設 x 為 "整數" 變數, 在 x86 的機器運行.
---------
result = function(x)

那麼把上行敘述譯成低階時, 大致會譯成如下:

push x
call function
mov result, eax

因此在 function 中,

mov eax, [stack point + 參數 offset] ;

值就拿出來了.
-----------
若是 result = function(&x)

當譯成低階時, 那麼就會譯成如下:

push offset x
call function
mov result, eax

因此在 function 中,

mov esi, [stack point + 參數 offset] ;
mov eax, [esi]

如此才拿的到值.
-----------
我們常常在 C 的 function 範例中, 可以發現,
宣告參數時, 有時會加一個 * 符. 如:

void function(int *val1, int *val2)
{
: : :
}

當母層要 call 過來時, 所丟過來的參數, 被指定
成是一個位址. 欲存取該位址中的數值時, 就要去
依位址去做存取內容.

假如你把此位址型式的參數存在 ebx 中好了, 那
麼此時的 ebx, 就變成一個 "指標暫存器" . 同樣
的, 假如把它存在 i 變數中, 那麼此時的 i, 就
變成一個 "指標變數" ..

--
Free Tech (Win32Asm, Electronics..)
http://freetech.cjb.net/
Updated: April-15, 2004 / 14:35

努力充實自己

unread,
Sep 7, 2004, 11:52:03 AM9/7/04
to
※ 引述《AUTOS...@bbs.et.ntust.edu.tw (妙處難與君盡說)》之銘言:
: ※ 引述《Fr...@we.are.the.world (FreeZ)》之銘言:
: > 就是 call function (它) 時, 丟一個位址給它,

: > 叫它去那個位址取資料.
: > 大多數的譯器, 對於字串、陣列等, 都會大多自動
: > 轉成指標的參數傳遞.
: > 但對於整數, 就不會了. 譯器讓你有選擇, 你要

: > 用丟指標呢? 還是要直接丟值呢?
: 請問那指標就是指call by reference的意思嘛?

指標應該是call by value傳址呼叫...
〈我記得JAVA沒有指標這種東西,怎麼會出現在這各版ㄋ????= ="""〉

call by reference是傳參考呼叫....

--
[1;36m※ Post by [37mbanana55 [36mfrom [33m220-142-28-235.dynamic.h�... [m
--
[1;33m / [37mOrigin: [31m南 [36m師 [33m資 [32m教 [37m小站 [m
[1;33m─ ● ─ [45m140.113.216.75 [m
[1;33m / [36mgicie.twbbs.org [m

努力充實自己

unread,
Sep 7, 2004, 11:53:09 AM9/7/04
to
※ 引述《banana55 (努力充實自己)》之銘言:
: ※ 引述《AUTOS...@bbs.et.ntust.edu.tw (妙處難與君盡說)》之銘言:
: : 請問那指標就是指call by reference的意思嘛?
: 指標應該是call by value傳址呼叫...
:
: call by reference是傳參考呼叫....
眼睛花了,看錯版面...= =""""

猴++ 拆了夫人又賠兵

unread,
Sep 7, 2004, 2:19:32 PM9/7/04
to
※ 引述《banana...@Kaohsiung.csie.nctu.edu.tw (努力充實自己)》之銘言:

> ※ 引述《AUTOS...@bbs.et.ntust.edu.tw (妙處難與君盡說)》之銘言:
> : 請問那指標就是指call by reference的意思嘛?
> 指標應該是call by value傳址呼叫...
> 〈我記得JAVA沒有指標這種東西,怎麼會出現在這各版ㄋ????= ="""〉
> call by reference是傳參考呼叫....

call by value是 傳"值"呼叫
call by address才是您的原意吧

--
[41m [37m陰陽師: [m
[46m [34m當有事情找上自己時 要先緩得了心情 心緒有了空間 [m
[46m [34m才更能深思熟慮...也才能換掉結果.... [m

--
[1;41m╭ [44m┼ [m Or [1mig [30min [m: [43m 彰化師大生物系˙吟風‧眺月‧擎天崗 [35;47m micro.bio.ncue.edu.tw [m
[1;42m┼ [45m┘ [m A [1mut [30mho [mr: [1;31mGenux [30m從 [36m203-204-172-186.adsl.static.giga.net.tw [30m發表 [m

努力充實自己

unread,
Sep 7, 2004, 10:38:05 PM9/7/04
to
※ 引述《Genu...@micro.bio.ncue.edu.tw (猴++ 拆了夫人又賠兵)》之銘言:
: ※ 引述《banana...@Kaohsiung.csie.nctu.edu.tw (努力充實自己)》之銘言:
: > 指標應該是call by value傳址呼叫...

: > 〈我記得JAVA沒有指標這種東西,怎麼會出現在這各版ㄋ????= ="""〉
: > call by reference是傳參考呼叫....
: call by value是 傳"值"呼叫
: call by address才是您的原意吧

是阿= ="....不好意思,最近老是眼花,= ="...多謝你的補充!^.^"""

--
[1;36m※ Post by [37mbanana55 [36mfrom [33m220-142-35-31.dynamic.hi< ... [m

0 new messages