[好站] 想學組合語言嗎?這邊有個不錯的免費中文網站喔!
(附上:兩本英文組合語言好書,PDF 全文下載)
小木偶的組合語言教學網頁
http://wanker742126.myweb.hinet.net/index.html
晚上收到一位網友詢問「有沒有組合語言推薦的參考資料」?經過一陣翻找,挖出一個被我遺忘還不錯的中文網站「小木偶的組合語言教學網頁」。推薦給該網友之餘,想想應該其他網友應該也有相同需求,就把連結貼了出來!
該網站鉅細靡遺地介紹了三種作業系統下的組合語言:
1. DOS 組合語言
2. Win32 的組合語言
3. Win64 的組合語言
雖然內容跟正統教科書比,不見得完整。不過已經是網路上難得的介紹文了。如果您希望有完整的組合語言推薦書籍,我這邊只有英文的。有兩本還不錯,也都能免費下載到完整的 PDF 檔:
"Assembly Language for x86 Processors, 6th Edition (2011)", by Kip R. Irvine
https://goo.gl/tJDY7Z
"The Art of Assembly Language"
https://goo.gl/h4DPMZ
希望這樣的資訊,能夠幫到想往「駭客、破解、資訊安全」這個方面發展的朋友!
如果您覺得這個資訊不錯,不妨轉發給您的朋友。獨樂樂不如眾樂樂,您說是吧?
同時也有253部Youtube影片,追蹤數超過16萬的網紅講日文的台灣女生 Tiffany,也在其Youtube影片中提到,雖然網友崩潰到不行,但我還是覺得這對太可愛了,跟北川Daigo夫妻一樣是我心目中的完美組合(手比愛心) #新垣結衣 #星野源 follow Tiffany: facebook▶ https://www.facebook.com/pg/TiffanySpeaksJapanese Instagram...
「組合語言教學」的推薦目錄:
- 關於組合語言教學 在 紀老師程式教學網 Facebook 的精選貼文
- 關於組合語言教學 在 講日文的台灣女生 Tiffany Youtube 的最讚貼文
- 關於組合語言教學 在 Erin's Diary 艾琳的日常 Youtube 的精選貼文
- 關於組合語言教學 在 五哥頻道 Youtube 的最佳解答
- 關於組合語言教學 在 [心得] 個人的x86 組合語言觀念筆記- 看板ASM - 批踢踢實業坊 的評價
- 關於組合語言教學 在 [教學資源] 71 部關於組合語言(Assembly)與C++ 的影音教學 的評價
- 關於組合語言教學 在 紀老師程式教學網- [免費影音教學] x86 組合語言簡介(Intro to ... 的評價
- 關於組合語言教學 在 紀老師程式教學網- [免費影音教學] x86 組合語言簡介(Intro to ... 的評價
- 關於組合語言教學 在 x86 Assembly Programming Tutorial | CHUPCCA 的評價
- 關於組合語言教學 在 i2p-nthu/7-Assembly.md at master - GitHub 的評價
- 關於組合語言教學 在 x86 組合語言| 他山教程,只選擇最優質的自學材料 的評價
組合語言教學 在 講日文的台灣女生 Tiffany Youtube 的最讚貼文
雖然網友崩潰到不行,但我還是覺得這對太可愛了,跟北川Daigo夫妻一樣是我心目中的完美組合(手比愛心)
#新垣結衣 #星野源
follow Tiffany:
facebook▶ https://www.facebook.com/pg/TiffanySpeaksJapanese
Instagram▶ https://www.instagram.com/tiffanysjapanese/
Twitter(內容全日文)▶https://twitter.com/TiffanyTWJP
Blog▶https://tiffanysjapanese.wordpress.com/
◇講日文的台灣女生◇
我是Tiffany 蒂芬泥,泥巴的泥。
100%的台灣人,從2013年進入日文系開始學日文的道路。
2017年9月-2018年9月在東京交換留學一年,目前定居台灣從事口譯的工作。
這個頻道主要是分享我最近學到的日文,還有我怎麼去理解日文的各式文法和用語。
立志成為帶動大家一起學日文的勵志演說家!
這不是一個日文教學頻道,只是把我曾經搞不懂的東西爬梳一下,再用我的語言分享出來而已。目前累積的影片都是在大家的鼓勵與回饋下完成的。
這裡的分享都是我自己消化之後的產出,可能會有講錯的地方
還要麻煩大家多多跟我討論和提醒了~
大家糾正我的地方都會補充在影片的更多資訊裡
(也就是這個欄位)
那麼就請多多指教了。
一起在學日文的道路上拔腿狂奔吧!
■□■□■□■□■□■□
每週一晚上9點 上傳新影片
■□■□■□■□■□■□
如果你願意協助我上影片字幕,我會非常感謝你!
字幕協力:https://www.youtube.com/timedtext_cs_panel?c=UCiQ4DB-7pv-fZgRoLO6sjsw&tab=2
今天的影片內容▶
【蒂芬泥的其他影片】
我的日文學習歷程
https://tiffany.pros.si/G8W52
跟我去工作!口譯工作的一天
https://tiffany.pros.si/FUK75
日劇「法醫女王 Unnatural」經典台詞日文解析:
https://tiffany.pros.si/H35KJ
不會做菜的我跑去日本做滷肉飯 feat. 強運少女RU
https://tiffany.pros.si/G4K9S
從日文程度0到在日本工作 日本就職經驗談 feat.阿倫 Alan Channel
https://tiffany.pros.si/H3T26
女生注意⚠️這些日文只有男生可以用! feat. 撒醬x日初
https://tiffany.pros.si/EBZN9
改掉這個發音日文變得好標準!台式發音矯正室 feat. IKU老師
https://tiffany.pros.si/ED3M5
不要這樣講日文!日本人糾正台灣人的台式日語發音 feat Kyon&Ai
https://tiffany.pros.si/DTHS6
變態卻有效的背單字方法 feat.王可樂老師
https://tiffany.pros.si/GT2PD
只有日本人懂的英文?salary man, jet coaster 和製英文英日意思比一比 feat.英文易開罐
https://tiffany.pros.si/GQBTV
日本情侶10天才見一次面?台日戀愛觀大調查! feat. D-saki
https://tiffany.pros.si/F6W9Q
本週關鍵字:
組合語言教學 在 Erin's Diary 艾琳的日常 Youtube 的精選貼文
這集分享我度過孕期荷爾蒙失調大爆痘的5個方法 ! 我在懷孕初期因為賀爾蒙轉變的關係,整個大爆痘!但是也因為懷孕的關係,一般調節賀爾蒙的補品,或是對抗痘痘擦的藥,也都幾乎不太能使用,也有聽過不少媽媽是一路痘痘到生完小孩才好
但我不死心,到處使用各種方法,也嘗試過完全沒有用的肌斷食,最後終於找到我的自然而然由內而外的抗痘秘方
0:00 搶先看
0:12 孕期大爆痘
1:36 抗痘方法 1 清粉刺
2:57 抗痘方法 2 補充燕窩, 膠原蛋白
4:23 抗痘方法 3 更換保養品 (非常重要)
6:28 抗痘方法 4 完全戒糖改喝蜂蜜
7:51 抗痘方法 5 戒炸物多喝水
8:39 低刺激的溫和保養品- medicube
這集感謝 medicube 的贊助,還有邀請我試用他們家超溫和的產品 - ZERO 毛孔爽膚棉溫和版!這一版低刺激,無黏膩感,適合敏感和痘痘肌膚,現在懷孕或是生完寶寶後還可以繼續用,真的不錯用喔。 最近天氣變熱了,剛好放在冰箱使用的話更清爽舒服。
使用我的專屬優惠碼,就能在medicube官網全館享有9折優惠 !特別限定1000組合,購買2件溫和版時,贈送 RED 積雪草修護霜+ 毛孔爽膚棉攜帶盒。
馬上查看ZERO毛孔爽膚棉溫和版 🛒 https://bit.ly/39Smn57 📌優惠碼: erin
*結帳時在優惠代碼格子內填寫此優惠碼!!!! 特價有效日期(4月8~4月21日)
#孕期抗痘 #健康抗痘 #皮膚保養 #medicube #ZERO毛孔爽膚棉溫和版
艾琳的自媒體經營分享會免費報名👉https://pros.is/U9Q5C
Podcast 搜尋 "自媒體大學"
即可獲取經營自媒體最新資訊/趨勢與方法
YouTube: https://www.youtube.com/channel/UC4Az4dgrLp8fkQ5_j9-2mfQ
spotify: https://pros.is/RQ6SC
soundcloud: https://soundcloud.com/user-335165411
Apple podcast: 搜尋自媒體大學
從零開始,為自己量身打造最出色的自媒體!
開始行動👉https://pros.is/JSV29 點擊網址 註冊會員免費試聽
艾琳自媒體經營直播教學訂閱方案👉https://pros.is/SCKX7
艾琳Erin的line@官方號服務~解決你旅遊遇到的大小事!
日本最前線👉https://lin.ee/zMHM3yf
韓國小幫手👉 https://line.me/R/ti/p/%40dtd1839l
艾琳聯誼團👉https://line.me/R/ti/p/%40uoa4117p
▶在其他地方看見不一樣的Erin~
FB艾寫字: https://www.facebook.com/ErinDiary/
IG艾旅遊:https://www.instagram.com/erindiary_0904
艾琳經營的官方網站: https://erindiary.tw/
-------------------------------------------------------------------------------------------
如何支持我的頻道?
▶來我的蝦皮賣場逛逛吧! 台韓精選好物
https://shopee.tw/erin0904
▶購買Erin 合作韓國/日本旅遊4G網卡, 比大廠低價, 收訊也穩定,
以下連結訂購會隨貨附贈一個韓規電源轉接頭喔!
https://www.sim2world.com/?utm_source=youtube&utm_campaign=erin
▶看完影片開始前的youtube廣告, 不要五秒略過喔!
用
你們的大大小小的支持都可以協助我繼續創作這條路!
-------------------------------------------------------------------------------
▶協作英文/日文/其他語言字幕連結: http://www.youtube.com/timedtext_cs_panel?c=UC6NOmGMdA1uF7b9gYEiBHlw&tab=2
拜託做完一定要讓我知道, 可以寄信到我的gmail聯絡信箱
我會準備小禮物和明信片感謝你!
-----------------------------------------------------------------------------------------
▶contact me : erin@cooljapantv.biz
▶使用硬體軟體:
相機: SonyRX100 / Sonya6500(慢鏡頭輔助)
剪輯軟體: Adobe premiere pro
音樂來源: epidemicmusic
------------------------------------------------------------------------------------------
我的近期熱門影片:
◈ 終於...我們結婚了!艾琳&毛巾的婚禮, 新郎爆哭的教堂證婚和午宴
https://youtu.be/ZTg1NUP0g_E
◈艾琳結婚花了多少錢? 完全超出預算大失血🤣
https://youtu.be/7HUXDt3rvtk
◈結婚倒數24小時不睡覺實錄!開箱我的新娘房,凌晨四點化妝,教堂彩排.
https://youtu.be/aXyng6wgN9g
組合語言教學 在 五哥頻道 Youtube 的最佳解答
Facebook廣告投於技巧,話難唔難, 但要新手學識, 真係開始時見到頭都大埋. 但如果你拍難唔學識Facebook行銷技巧, 咁你一定後悔, 因為世界上好多人都用Facebook Marketing達到可觀收入, 你仲等乜?快啲去睇呢條片學識佢啦?
2020年全世界都飽受COVID-19的影響,香港也不能幸免,好多網友留言或私訊話我知他/她被裁,各大行業都受影響,你有無想過可以以力打力,借助互聯網以及Digital Marketing的威力可以為自己找一條出路,什至有網友跟住我過往的教學已可以放棄正職,走出一條自由之路?。如果你是同路人,就快啲睇以下2021年最新版免費教學,保證另你大開眼界,什至有機會放棄奴役你十幾二十年的朝9晚9工作?
?14日免費試用Shopify ?http://bit.ly/2vzY1bP
?Udemy課程? https://www.udemy.com/course/shopify-e/
✅Shopify教學? https://www.patreon.com/5gor
⚡網絡輕鬆賺錢? https://tinyurl.com/y3rrkbfh
?Shopify58集教學?http://bit.ly/2zj5myF
?2021最新Shopify廣東話教學
EP01⚡Hea做兩個月?https://youtu.be/RvKJOD07nqI
EP02⚡新手開店完整步驟?https://youtu.be/6zolE0tnvLg
EP03⚡由零開始?https://youtu.be/1SIfYkbg5P4
EP04⚡每日15分鐘?https://youtu.be/EkYaSlvd8fM
EP05⚡不要用Paypal?https://youtu.be/A6q9-4XRSXc
EP06⚡嚴選ePacket國家?https://youtu.be/tQEicvihb4g
Shopify是一家電子商務網站平台,成立於2006年,是協助中小零售商快速架起自有網路商店的龍頭廠商,截至2018年,全球超過 80萬家的中小企業使用他們的一站式電商平台服務,透過Shopify網站銷售的年營業額高達1000億美金,客戶中也不乏像是Tesla、Forbes 這類知名的廠商。
Shopify具有很大的彈性可以客製化你自己的品牌電商網站,你可以自己設計版型,Shopify 提供各式各樣的工具,可協助您設定和營運您的商店、庫存管理、物流與價格設定、銷售數據追蹤、處理付款、支付整合功能等。使用Shopify方便你快速建立網站後,專注提升電商網站銷售。
14日免費試用Shopify ?http://bit.ly/2vzY1bP
#1【5分鐘開Shopify網店】https://youtu.be/v_4Sg6IygqA
#2【5步令你Shopify網店變得更專業】https://youtu.be/hwfLjjqoomg
#3【Shopify網店如何設定Theme】https://youtu.be/OTUGmRc4h04
#4【Shopify網店如何加入產品】https://youtu.be/z7Oz6dYGOng
#5【Shopify網店如何加入有多個款式產品】https://youtu.be/H0FcDellYJc
#6【Shopify網店如何加入產品Collection?】https://youtu.be/h7vehQXCy4Q
#7【Oberlo如何幫你唔使幾秒加入產品?】https://youtu.be/15d8fFBMBys
#8【無敵組合Shopify+Oberlo開網店】https://youtu.be/c2pM6-cPMXc
#9【Shopify如何設定付款和運費? 】https://youtu.be/Eyu69z0_M84
#10【Shopify網店4個推介App】https://youtu.be/5GND5-WLPNE
#11【Shopify網店最重要一步】https://youtu.be/-RAEPPIS7Fk
#12【Shopify網店如何連結新域名?】https://youtu.be/PRQYy00Z2kY
#13【3招教你揾出大賣產品】https://youtu.be/wEfBrH8Ze2g
#14【Shopify兩個不為人知的方法】https://youtu.be/PFV-fxB0_oY
#15【秘技?五分鐘揾出大賣商品】https://youtu.be/QpdAk9ptbYg
#16【一個秘技另今成為Shopify網店專家】https://youtu.be/L-pkiHYyM0U
#17【一口氣解答的70條問題】https://youtu.be/nzxOspxCM3k
#18【開完網店,但無人流,點算?】https://youtu.be/6be4LB6pnV0
#19【開左Shopify網店,突然想休息一個月,點算?】 https://youtu.be/lar0aG2xUpY
#20【揾到Winning Product大賣產品之後還要】https://youtu.be/3Iulb1RqKrQ
#21【 Shopify教學】一個我揾Winning Product秘密?https://youtu.be/pYEDq-1GDMA
#22 如何更改Domain名 https://youtu.be/8jZgohSeLiU
#23 開始用Facebook賣廣告 https://youtu.be/RxKUvMHwRrU
#24 開Shopify網店幾個經常問題?FAQ https://youtu.be/krZUHfryXpI
#25 Shopify App一個打40個 https://youtu.be/Oa7IdjIADaY
#26 Patreon平台專講Shopify及網上揾錢秘密 https://youtu.be/sJOYpNivJDk
#27 要成功其實只須要.... https://youtu.be/xKKzRSRWj80
#28一個App可以幫你慳好多錢 https://youtu.be/2V08q2sz0mc
#29 一個免費App幫你五分鐘做出一條超正推廣Video https://youtu.be/bZryirY2JMA
#30 武漢肺炎玩死Dropshipping?https://youtu.be/afr3Zs7PsfI
#31 想做香港人生意?點做物流?點樣畀客戶上載入數紙等問題?https://youtu.be/WuDDPpBY2J8
#32 Product Bundles同Volume Discounts有幾重要 https://youtu.be/5Qsi1EplXbE
#33 多國語言App https://youtu.be/fvr-jyFfzpU
#34 傳統商店用Shopify+兩個APP快速轉型為網店 https://youtu.be/DpSSKgsfU1w
#35 使商店能夠以多種貨幣銷售 https://youtu.be/YDmuPVC7a8s
#36 同學網店分享,做一個月揾5位數 https://youtu.be/s-zzUvzjQQY
#37 由Oberlo同Eprolo入貨 https://youtu.be/EPcEIpHHxsM
#38 如何刪除頁尾的"Power by Shopify"Logo? https://youtu.be/nQJqk04jT2M
組合語言教學 在 [教學資源] 71 部關於組合語言(Assembly)與C++ 的影音教學 的推薦與評價
教學 影片連結: https://goo.gl/oLrWJ羨慕那些從事「駭客」或「資訊安全」的高手高手高高手們嗎?想學「 組合語言 」或「C++」,成為縱橫系統底層的軟體 ... ... <看更多>
組合語言教學 在 紀老師程式教學網- [免費影音教學] x86 組合語言簡介(Intro to ... 的推薦與評價
[免費影音教學] x86 組合語言簡介(Intro to x86 Assembly Language) YouTube 播放清單: https://goo.gl/qwA6ah... ... <看更多>
組合語言教學 在 [心得] 個人的x86 組合語言觀念筆記- 看板ASM - 批踢踢實業坊 的推薦與評價
※ [本文轉錄自 C_and_CPP 看板 #1Cis6A7c ]
作者: purpose (purpose) 看板: C_and_CPP
標題: Re: [問題] C/C++ 中的 asm 該如何學起?
時間: Tue Oct 12 03:12:07 2010
發篇筆記
一、[簡介] 機器語言與80x86
二、[觀念] 組合語言—Intel Style 與 AT&T Style、MASM 與 NASM
三、[教學] 簡單連結範例—NASM 組合語言 與 C/C++ (Windows 平台)
-------------------------------------------------------------
一、[簡介] 機器語言與80x86
大家家裡用的計算機器叫做個人電腦 (PC)。
可以拿來安裝 Windows、Linux,甚至 Mac OS X...等作業系統。
個人電腦的 CPU 演變歷史,可以說就是 Intel 的歷史。從最早的16位元CPU:
「8088/8086 -> 80286」,再演化到32位元的 80386、80486...
後來因為商標不能用數字註冊,Intel 不使用 80586 命名,從586開始,
改名為歷史上的 Pentium CPU。
AMD 也差不多是在 Pentium 時代開始慢慢成為 Intel 在個人電腦處理器上的
競爭者。
可以想見 Intel 就是個人電腦處理器的「唯一制定者」,Intel自己做新的 CPU
也要向後相容以前的東西,就像 Windows 7 也得要能執行 Windows XP 的程式一般。
你在 286 寫的程式,拿去給 486 的 CPU 也要能跑。
所以「個人電腦 CPU = x86 家族」...好啦,可能有人不認同這句話。
你跟美國人講話就要講英文、跟法國人講法文;
跟 x86 家族的處理器講話,就要講「x86 機器語言」;
跟 Intel 8051 單晶片處理器溝通,就講「8051 機器語言」;
在算盤本裡面介紹的處理器是「MIPS」家族,就用「MIPS 機器語言」跟其溝通。
所有處理器裡面,x86家族功能當然是最強,每一代都有增加新功能,又要向後相容,
所以其實該語言最複雜、不規則、不好學。但只用些基本的功能的話,還是過得去的。
二、[觀念] 組合語言—Intel Style 與 AT&T Style、MASM 與 NASM
機器語言因為電路關係,原始形式就是 010101 這種二進位形式,但你喜歡也可以
轉成十六進位寫出來給別人看。
下面這是一個 x86 機器語言指令 (instruction):
05 0A 00 00 00 (十六進位表示)
用人類說法就是你告訴某顆 x86 家族的 CPU:
「把你的 eax 暫存器內容取出,將其跟10相加,再把結果寫回 eax 暫存器」
用C語言表示法就是:
「eax += 10;」
機器語言形式顯然太麻煩了。
於是發明了「助憶符號」,比如用 add 代表「相加這個運算動作」;
減法動作,用符號 sub 標記;
將資料從A處複製過去B處的動作,就用 mov 助憶符號標記。
add, sub, mov...等是運算子,而 eax 暫存器跟 10 是運算參與單元 (運算元)。
如果綜合以上講的運算子跟運算元,想要寫出完整指令時,還會有一個問題!
若有 eax, ecx 兩個運算元,想要把 eax 的值取出,複製到 ecx 去
到底該寫 mov eax, ecx 還是 mov ecx, eax ?
哪邊來源?哪邊目的?
AT&T、Intel 各自有一套語法慣例。
詳細資料參考這裡:
https://www.ibm.com/developerworks/library/l-gas-nasm.html
C語言 Intel AT&T
指派運算子的 靠最左邊的運算元 靠最右邊的運算元
左邊是目的地 是目的地。 是運算結果放置處。
int eax = 4; mov eax, 4 movl $4, %eax
(暫存器名稱前,需加 % 符號;
而且4這個立即數值前,需加 $ 符號;
且用 movl 表示 move long 這麼長)
西瓜靠大邊,跟大家一起用 Intel 慣例的寫法就好。
像上面 mov eax, 4 這樣子的指令形式,都叫「組合語言」,說穿了只是把當初
的「x86 機器語言」寫成比較容易看懂的形式而已。
既然這樣,那 x86 機器語言就一套,助憶符號跟暫存器也固定那幾個。
為什麼最後卻搞出 MASM、TASM、NASM、FASM...這麼多種組合語言呢?
MASM,軟體界霸主微軟推行的組合語言 (雖然微軟最近變心去搞 MSIL 的樣子?)
NASM,在台灣是僅次於微軟的選擇方案,而且跨多個作業系統平台。文件完整、
有中文書籍在講它,而且狀態穩定。
※ FASM,較新,類似於NASM,聽說比較快?
※ TASM,老牌子,現在很少人用了,但是有 Turbo Debugger 很強大,可以
對 16 位元執行檔做偵錯,偶爾也值得一用。
上面提到的組合語言都是 Intel Style,而 AT&T 會看到的地方,就是使用「gcc -S」
功能時會出現。但是可以用 objdump 去看 Intel Style 的組語。
如果是 gdb 偵錯則直接就有選項 disassembly-flavor intel 可以切換到
Intel 風格組語。
分別用 VC 跟 GCC ,一樣寫個 C 語言動態函式庫,把某個函數輸出,
我用 VC 時,可以在函數前面加上 __declspec(dllexport) 告知 VC 將該函數輸出。
也可以寫個「模組定義檔」(*.def) 去記載哪些函數要輸出。
但是這兩個方法都是 VC 特有,不是 C 語言規定的。
同樣狀況在組合語言亦同,MASM 也有一些組譯器指令是其專有,而 NASM 沒有。
甚至在語法上,兩者也有差異。
詳細資料:https://www.nasm.us/doc/nasmdoc2.html#section-2.2
NASM 對於「LABEL 符號」是有分大小寫的,MASM 沒有分。
(這不包含暫存器名稱,沒必要非寫 eax 而不寫 EAX,
也不包含 NASM 的假指令,比如 SECTION 大小寫都可以。)
而且 MASM 有些遭詬病的語法規範,NASM 有對其改進之。
對於 MASM
「某符號」要拿來「當成記憶體位址」用時,需加上 offset 修飾。
對於 NASM
覺得微軟這樣太麻煩,直接寫就一定是當位址用,不用加 offset。
MASM 的毛病是
如果寫組譯器指令如下,去定義兩個符號: (MASM、NASM 都支援這兩個假指令)
foo equ 1
bar dw 2
equ 指令很類似 #define pi 3.141421356 (...偷用別人的梗)
dw 這個假指令,是告訴組譯器把現在這個地方,所對應的記憶體位址,
取別名叫 bar,並且寫入 double-word (4位元組) 到此處,
存放值為 0x 00 00 00 02。
此時,如果 MASM 有兩個指令如下:
mov eax, foo ; foo 因為是 equ 設定出來的值,所以 eax 會得到 1
mov eax, bar ; bar 因為是「組合語言變數」,故 eax 得到值是 2
上面兩個指令,語法格式看起來完全一致,
但如果沒去觀看 foo 跟 eax 的假指令定義,就不能判定機器碼該翻成哪個。
如果是用 NASM,因為他強制規定只要是「間接取值」者,一律需加上中括號 []。
這個間接取值,意思是第一次取到的值,不是我要的,第二次取到的值才是我要的。
可以想成「間接取值 = 二次取值」。
換言之
mov eax, foo
mov eax, bar
對於 NASM 來說,不需要去看假指令定義,
因為 bar 跟 foo 都沒有用中括號,所以兩個都做一次取值就好。
亦即 mov eax, bar 會得到 bar 對應的記憶體位址,而不是 bar 的存放內容 2。
可是 MASM 很沒規律,因為 foo 是 equ 所定義,所以 eax 得到 1 (沒間接取值);
因為 bar 是一個 dw 定義的「組合語言變數」,所以將會做「間接取值」,先取得
bar 所對應的記憶體位址後,再到該位址再取一次值。
抓4位元組得到 2 來傳給 eax。
三、[教學] 簡單連結範例—NASM 組合語言 與 C/C++ (Windows 平台)
存成檔案 xx.c
---------------------------------------
#include <stdio.h>
int plusTen(int val);
int plusEleven(int x) {
return x+11;
}
int main() {
printf("return = %d\n", plusEleven(1));
printf("return = %d\n", plusTen(0x00123456));
return 0;
}
---------------------------------------
用 VC 編譯器的話,執行指令 cl /c xx.c 可以獲得對應的目的檔「xx.obj」
從 Visual Studio 200X 命令提示字元,去下這個 cl 指令,以省略環境變數的設定
存成檔案 fun.asm
---------------------------------------
section .text
global _plusTen
_plusTen:
push ebp ;函數初始化工作
mov ebp, esp ;函數初始化工作
mov eax, 0
mov ax, word [ebp+8]
add eax, 10
pop ebp ;函數結尾工作
ret ;返回呼叫函數 (caller),eax 是存放返回值用
---------------------------------------
去下載 NASM
https://www.nasm.us/pub/nasm/releasebuilds/2.09.02/win32/nasm-2.09.02-win32.zip
解壓縮後,執行指令 nasm -f win32 D:\Desktop\fun.asm
就能獲得一樣是 COFF 格式的目的檔 fun.obj。
簡單來說就是這個目的檔跟 cl /c 得到的目的檔有一樣格式。
最後再去「Visual Studio 200X 命令提示字元」下指令 link xx.obj fun.obj
就能得到 xx.exe 完成 C/C++ 跟 NASM 函數的連結了。
※對原理有興趣可以參考《程式設計師的自我修養》一書。
section .text
是 NASM 假指令,表示從這行指令以下的內容,翻譯成機器碼後
都要放到 .text 區去。每個 *.obj、*.exe 內部都有 .text 區段。
global
是 NASM 假指令,在這裡表示要把 _function 標籤包括的機器碼
視為全域函數。
在 C/C++ 你預設寫個函數,像上面的 plusEleven() 就自然會是
這裡說的這種「全域函數」。
使用 dumpbinGUI 工具,跳去 xx.obj、fun.obj 查看符號表,就可
看到 external 字眼。表示 xx.obj 可以調用 fun.obj 裡面寫
external 的符號,反之則反。
mov ax, word [ebp+8]
這個 ebp+8 是代表 plusTen() 函數的「參數1」
查一下 stack frame 的觀念,再用偵錯軟體觀察「函數呼叫」
進入前後的堆疊、暫存器變化,應該就能理解。
要說明的是,[ebp+8] 是「二次取值」,當第一次取值得到
ebp+8 位址假設是 0x0012FF74,接著要在這個地方做二次取值,在
C/C++ 要取幾個位元組的值是看該指標的資料型態。
如果是在 MASM,則是在中括號前寫 word ptr [ebp+8] 代表 2位元組;
若寫 byte ptr [ebp+8] 則代表 1位元組。
而 NASM 跟 MASM 差不多,但必須拿掉 ptr 字眼,否則會組譯錯誤。
因C語言還沒公開前,就已經留下一堆目的檔、一堆函數,他們都用正常的命名,
一些好記的名字都被用過了,所以 C 語言在使用函數時,其實一律自動加 _ 來命名。
因此原本的 C 函數呼叫雖然是 plusTen,但在 fun.asm 裡輸出的全域函數要寫成
_plusTen 才能讓 xx.c 可以連結到。
------------------------------------
關於「目的檔」,參考這篇:
https://en.wikipedia.org/wiki/Object_file
都只講微軟平台
在 DOS 時代目的檔名稱也都是 *.obj;執行檔名稱也都是 *.exe,
但這裡的 *.obj 其實是 OMF 格式 (Relocatable Object Module Format)。
跟你在 Windows 用 VC 編譯出來的目的檔 *.obj 不同。
用 nasm -f obj fun.asm 應該就是產生 OMF 格式的目的檔?
用 nasm -f win32 fun.asm 則是產生 COFF 格式的目的檔。
更精確來說這個 COFF 格式是微軟修改過的變種 COFF 格式。
你也可以叫它 PE/COFF 格式,甚至叫他 PE 格式也行,要解讀 PE 格式,其
第一選擇當然也是微軟提供 dumpbin,而軟體 dumpbinGUI 是圖形介面的前端。
真要說的話 dumpbin 也是一個前端,其實是呼叫 VC 的 link.exe,給隱藏選項
link /DUMP /ALL xx.obj。
https://en.wikipedia.org/wiki/Portable_Executable
PE 格式不一定是 *.exe 執行檔,也可以是 *.dll 也可以是 *.obj...等。
因為 VC 編譯出的目的檔都是 PE 格式,而 VC 的 link.exe 不能處理古早的
目的檔 OMF 格式,所以上面需要叫 nasm 用 -f win32 選項去產生 PE 目的檔。
也許會有某個很強的連結器,可以把 OMF 跟 PE 目的檔連結成 PE 執行檔吧?
甚至把 gcc 編出來的目的檔跟 PE 目的檔 link 成 PE 執行檔?
看有沒有人知道囉
------------------------------------
MASM 組譯器指令清單 https://msdn.microsoft.com/en-us/library/8t163bt0.aspx
剛好看到,補充上來。
------------------------------------
(怕以後忘記,再寫篇記錄,上文不變動,新增內容於下)
16位元記憶體模型—Segment:Offset (分段記憶體模型)
32位元記憶體模型—Flat Memory Model 加 Paging
( https://en.wikipedia.org/wiki/X86_architecture )
個人電腦 x86 家族的 CPU,在 16 位元時代是 8088/8086/80286 這三位;
而 x86 家族第一個 32 位元始祖是劃時代的 80386。
8088跟8086的位址匯流排都有20條線,每條線都是一端連接記憶體,一端連接
處理器,在高低電位變化下 (0、1),總共可有 2^20 種控制變化。
換言之,依照每個記憶體位址對應一個位元組的慣例,可以定位 2^20 大小的
記憶體位址;
80286 則進化到 24 條位址線,定址能力達 2^24,即 16M 記憶體。
省麻煩,把它當成跟 8088/8086 一樣,只能定址到 1M 記憶體就好。
※ 在 x86 的術語中,記憶體位址可以分成三種:
邏輯位址、線性位址、真實位址(物理位址)
必須先「邏輯位址→線性位址」,然後接著才是「線性位址→真實位址」。
自從32位元 CPU 出現 (自 80386 後),記憶體 Model 變成 Flat Memory,
邏輯位址就已經等於線性位址了。
然後是因為有「分頁機制」武力介入,所以需要先透過分頁機制轉換,線性位址
才會變成真正的物理位址。
而分頁機制是從 80386 開始使用 (保護模式的完整版也是從 80386 開始)。
那為什麼 16 位元處理器,不使用 Flat Memory Model?為什麼當初的邏輯位址
要先經過轉換才會變成線性位址?
因為16位元CPU內部,參與運算的暫存器當時都還停留在16位元
(如:ax, bx, cx, dx),甚至最重要的指令暫存器 (IP) 也是 16 位元,
故只有定位到 0~65535 也就是 64K 記憶體的能力。
Intel 用額外提供的四個「分段暫存器」(CS、DS、ES、SS),搭配其他暫存器後
,使得每次記憶體定址方式其實是 Segment:Offset,此時這種位址表達法叫
邏輯位址。
CS 是 Code Segment、DS 是 Data Segment、SS 是 Stack Segment ...
邏輯位址→線性位址,公式是:「Segment Register * 0x10 + Offset」
假設我們有個程式,裡面的「全域變數」(不是放在堆疊的那種區域變數),
有個很大的整數陣列,總共有 128K。當程式執行時,這些資料區段假設放在
「線性位址=物理位址」的 0x0 ~ 0x1FFFF 這段連續的記憶體空間裡。
在邏輯位址(以寫程式的角度去觀看的位址),這 128K 資料會被分成兩段,
第一段是 DS=0 且 offset = 0x0000~0xFFFF,第二段是 DS=1 且 offset
= 0x0000~0xFFFF。
換言之,如果我要把某陣列元素移到 ax 暫存器,指令可能長這樣
mov ax, word ptr[0x1234]
如果執行這行時 DS=0,則會取到物理記憶體位址 0x01234 處 (第一段);
如果執行這行時 DS=1,則會取道物理記憶體位址 1*0x10 + 0x1234 = 0x11234。
若要讀取最後一個位元組到ax,只要執行以下指令即可:
mov ds, 1
mov al, byte ptr[0xFFFF]
因為不知道當時的 DS 值為多少,所以保險點,先設定 DS,然後因為 ax 是
16 位元,不必用到這麼大。所以用 al 存放即可。 al 就是 ax 暫存器
低 8 位元別名。
(ax 在 32 位元以上的 CPU 時,其實也是 eax 暫存器的低16位元處別名)
現今的執行檔,比如 PE 執行檔,往往內部都有分 .text (.code)、.data,
可能就是承襲當初的記憶體分段機制?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.140.240
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.128.171
... <看更多>