作者game0416 (鳳狼)
看板NTUE-CS102
標題Re: [閒聊] 程設作業
時間Fri Nov 18 14:35:11 2011
豆腐作業寫寫就覺得自己很弱,不過很懶得讓自己變強(被打臉
這次作業寫到現在只拿到90%,最後10%小數還是覺得花時間很懶(還是被打臉
好像沒什麼聽說作業寫不出來的
感覺只有我困擾了很長一段時間感QQQ
首先,因為很弱,所以得站在巨人的肩膀上
#1AzxvVlH (NTUE-CS100)有這學期需要的作業相關資料,與幾個重要範例
比方這次很麻煩的數值輸入,然後配合投影片chap5.chap6對於Irvine32.inc函式說明
與jmp相關範例就能做完這次作業了
--
不過呢,我還是覺得先從組譯環境建立開始說起
如果你想照老師講義從2008開始,那就是參考這份較新的文件參考
http://kipirvine.com/asm/gettingStartedVS2008/index.htm
下載在
http://www.microsoft.com/taiwan/vstudio/aa700831.aspx
我是直接拉了2010,配合2010版本的說明去做
http://kipirvine.com/asm/gettingStartedVS2010/index.htm
下載在
http://www.microsoft.com/visualstudio/zh-tw
記得安裝時是裝
"Visual C++ Express 2008" / "Visual C++ Express 2010" 就好
底下很多設定需要設定...可以直接選擇像他前頭範例說明一樣
開啟c:\Irvine\Examples\ch03範例後,移除main.asm新增一份自己的asm進去
就不用做其他設定了
--
直接組譯範例,或是之後自己寫的東西
組譯會有警告訊息如
'Project.exe': 已載入 'C:\WINDOWS\system32\usp10.dll',找不到或無法開啟 PDB 檔
案
這些訊息不用在意,當作是正常組譯完成就可以
PDB沒有是非常正常的
跳出CMD畫面一閃即逝,沒有"Press any key to continue . . ."停著
倒是因為Express好像不如範例會自動加上去這行
你可以在
call WriteString
exit
之間補上
call WriteString
call WaitMsg
exit
就會正常一些了>_O
--
作業很像去年Java第二份作業
: #1Ck_oO_c (NTUE-CS102) / #1CoEFyz1 (NTUE-CS102)
這次我們少了安心的Java內建parse函式,真的要土法煉鋼刻完字元陣列轉數字
這部分已經有chchwy學長給的一組範例在
http://chchwy.blogspot.com/2008/10/masm-io-patterns.html
這裡頭有幾個小錯誤需要自己改正,特別注意是註解以;開頭,而不是//
編譯不過顯示must be in segment block的
請看清楚這份範例少了標頭、引入、程式起始結束點等等的
這個在ch03\main.asm裏頭都有,自己參考一下該擺在哪
請記得作業要求有寫到所有jmp都要註明意義,以及為了追加一個負號flag
所以還是要自己看懂這段code的喔Q
嗯...我不知道該怎樣再次講解這份code,因為註解大概說明完了
如果有問題請推文/回文明確說明一下問題,要針對某部分解釋倒是還可以
至於說小數部分,算是型別轉換後,遇到小數點後改乘0.1,後面應該沒什麼變化
: cmp我不太確定能不能正確判讀小數比較
不過我很懶(略)
--
拿完數值之後,就剩排序部分
相對於前者,後者可以說是非常簡單
這是個C++泡排code,也是我們要寫成組語的原形(?)
請不要拿g++配參數編譯到組語層就停下來,那樣應該會被打臉(?)
for (int i=0;i<len-1;i++){
for (int j=i+1;j<len;j++){
if (ar[i]>ar[j])
change(ar[i],ar[j])
}
}
解析一下這段要完成三項
分別是
1.巢狀迴圈
2.if判斷
3.記憶體資料交換
--
同樣地,學長有一份巢狀/for loop的範例可以當基底修改成我們需要的樣子
這部分我是直接看for迴圈
稍作修改就變成要的雙層for迴圈了
以原型做點這樣簡單修改就會變成這樣,當然這樣改是有問題的,需要再追加一點改正
mov ecx,0 //把ecx當作計數器i
_for:
cmp ecx,9
jge _endfor //jump if greater & equal
mov ecx,0 //把ecx當作計數器j
_for2:
cmp ecx,9
jge _endfor //jump if greater & equal
//statement;
inc ecx //ecx++
jmp _for
_endfor2:
inc ecx //ecx++
jmp _for
_endfor:
--
做if判斷,就是ch06投影片範例p26
正確利用
mov esi,OFFSET intArray
add esi,4 ; (???????)
mov eax,DWORD PTR[esi]
取出值,再利用範例比較就能簡單比較出大小
cmp eax,ebx
jg change
jmp end
change:
(資料交換)
end:
最後輸出的部分,則是利用for loop、既有WriteInt與WriteChar簡單就能做出輸出結果了
多個+號應該是不會怎樣啦(跑遠
--
紅白本命
○楽園の巫女
博麗 霊夢 職業:博麗神社の巫女さん
Hakurei Reimu 能力:主に空を飛ぶ程度の能力
@東方project系列
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 120.127.47.30
推 pk873:人強真好 Q口Q 11/18 18:11
推 pk873:移除main.asm新增一份自己的asm進去 高招!!!!人強真好 11/18 18:28
這明明人家範例Q______Q而且你的程度哪裡跟我人強真好QQQ
推 dosomethnig:為什麼海賊王最近很拖戲.. 11/18 21:25
推 joe989879:樓上...我也這麼覺得... 11/18 22:06
另外補一下,作組語作業請把自己當人間編譯器
先寫出來C++/Java的code之後,逐行改成asm會比較容易代入思考
不然這語言實在寫不動
※ 編輯: game0416 來自: 119.14.27.224 (11/18 23:44)
推 j2612280:鳳娘大耶_O_ 11/19 00:48
推 CaptainWill:先推,回宿舍再來煩惱@@ 11/19 03:01
推 jerry771210:有推有過 11/20 16:02
※ 編輯: game0416 來自: 119.14.27.224 (11/21 20:48)