使用組合語言程式設計常見錯誤與技巧(無限期小結中……):
1、定義的變數的位數與所涉及到的暫存器的位數不一致。。。。
2、沒有把count1=$-string1 緊跟著放在string1的定義之後,注意$的含義噢!它用來儲存當前正在彙編的指令的偏移位址。。。。
3、使用中斷指令時,不光要對ah做出修改,還要影響al的值,大家注意咯!!!!
4、要學會將 能影響標誌位的語句、判斷標誌位的語句與跳轉語句結合使用。。。
5、學會利用移位語句,要記得它有乘除的效果。。。
6、我居然把start的位置放到了ds、es、cs、ss的初始化語句之後了,結果。。。。。。。。編譯鏈結通過了,執行嘛。。。。。。。。。。。。。。。。。。。。
7、定義的變數是可以直接用inc、dec的。。。。。即對其內容值加
一、減一。。。。。注意:雖然變數可以看成符號位址,不過此處只是把它們的資料內容加減一,而非對其位址。。。。。話說當時居然以為不能直接用inc、dec。。。。。。。。哎。。。。。。。。。
8、暫存器、變數、segment等內容未初始化。。。。。。。。。。。乙個字:錯!!!!!!!!
9、有時候真夠弱的,明明是有符號數比較,居然用了ja、jb等。。。。。。。哎。。。。。。。。。。。。。(讓錯誤來得更猛烈些吧!!!!!)
10、使用offset、lea時,別忘了要用16位的暫存器去裝偏移位址。
11、使用十六進製制數時,若第乙個數字值是字母,而且未在其前加0,則會被認為是變數。
12、資料段中定義的第乙個位元組單元的ea是0,^ ^ ,別誤認為是單元的資料噢!
13、暫存器、變數之間傳遞值時,記得位數要一致噢!
14、話說今天居然定義了 value db 0 ,mov dl,value ,mov ah,02h ,int 21h,結果輸出。。。。其實應該是value db '0' ,因為dl中放的應該是所要輸出的字元的ascii碼才對!
15、shl 1、shr 1相當於乘以2、除以2,而非是單純地被看成左移1位、右移1位。
16、在考慮演算法時,不要忘了考慮邊界情況。
17、如果儲存單元大小是字,則不是使用inc si,inc di,而是使用add si,2,add di,2。
18、可以用si指示當前位置,而使用di指示長度變化中的陣列的尾部。
19、在程式設計前,先畫個流程圖(有時候就連想畫正確都很難(過程分支太多,交叉跳轉也很多,問題本身也複雜),更別提直接上機編寫了),建立一下基本框架,能幫助自己採用正確的迴圈結構,減少失誤。
20、可以使用[bx][bp][si][di](十六位定址:基址暫存器、變址暫存器),但不能使用[dx]、[ax]等。
21、當出現死迴圈時,執行程式後無法正常終止,可能原因是跳出條件總沒有達到。
22、當你要辨別乙個數是奇數還是偶數時,不管它是以原碼形式表示,還是用補碼形式,只要看它最後一位,為1即為奇數,為0即為偶數。
23、乙個數的表示形式(原碼、補碼)不會影響其奇偶性。
24、使用call時要記得把子過程與主過程放在同乙個**段內,同時應該注意end start的位置應在最後。
25、使用push後記得相應地使用pop,還要注意二者應反序,即push ax,push bx,push cx與pop cx,pop bx,pop ax相對應。
26、與第25點相應的,在子過程中的 ret 處之前應放上相應地放上pop語句,而子過程的入口處應相應放上push語句。
27、再談畫流程圖,在組合語言中,細節的東西往往考慮得太多,以致於因為大量的跳轉語句、分支的存在而使編寫者產生思維混亂。個人認為,可以考慮在每個判斷語句後都使用雙跳轉,盡可能增加跳轉標號的數量,而且名字越詳細越好,這樣可以提高可讀性。在分支的發展路線上,可以都採用二元分支,並且應保證各個分支最終都有相應的出口。從巨集觀上來觀察,入口只有乙個,出口也是,從入口進來,分支會逐漸增多,當到達乙個極點後開始逐漸減少。當然,我們在畫圖時可以一步一步來,先用概括性的語句來描述,再用偽**,最後採用真正的**,逐漸深入,逐漸完善,自上而下,一步一步靠近細節。從大框架到各步驟,再從各步驟的小框架到各語句,框架之中還有框架……
28、1000 0000b == 0000 0000b == 0d
29、回車、換行 與 換行、回車 等效。line feed:換行,回車:carriage return。
30、 在使用中斷之前,最好注意一下當前是否有對ax的使用,若有需要,必須先將ax入棧,完成中斷後再出棧。
31、若定義了 a dw 6,7,8,則6、7、8的儲存位址分別為a+0、 a+2、 a+4。使用mov語句時,應分別用a[0]、a[2]、a[4]。
32、cmp [si],'s',使用debug時,注意到它顯示cmp word ptr [si],53 了嗎?如果之前定義的是array db 's','d','g',且lea si,array,則此處可使用強制型別轉換,即cmp byte ptr [si],'s'.
33、有時候覺得結果太多,輸出很不方便,可以直接在debug中使用-d來檢視ds中的內容。
34、題目要求的資料要有一百個怎麼辦?可以這樣寫:data_array dw 10 dup(1,2,3,4,5,6,7,8,9,0)
35、當把loop與jmp結合使用,每次從loop的尾部 jmp 到標號lop1前,應記得為cx設初值。
36、array db 1,2,3,4,5 ,lea si,array ,mov ax,[si] ,編譯器不會報錯,但結果已經錯了,應該改為mov al,[si]。
37、如果是遠過程,那麼**段的開始應寫上:
codes segment
main proc far
assume cs:codes,ds:datas,ss:stacks
start:
;此處輸入**據段**
push ds
sub ax,ax
push ax ;遠過程結尾用 ret 返回時必須使用這三句語句。
;如果未使用這三條語句,則必須mov ah,4ch,int 21h返回dos。
mov ax,datas
mov ds,ax ;資料段暫存器初始化
38、資料段、附加段、堆疊段,只要沒用到的,都可以不使用assume,都可以不初始化。這樣並不會影響結果。
39、在資料段內定義dat db 30h,41h(元素在同一行時這樣寫),(不在同一行時,這樣寫:)
dat db 30h
db 41h
40、在上例中,inc dat,加的是dat[0]. 而[dat+1]指的是dat[1].若用的是dw來定義,則[dat+2]裡裝的才是41h。
40、start與end start是必需的。
期待更新中。。。。
收藏於 2009-04-10
在iOS中如何使用組合語言
本文將系統地介紹如何利用xcode在ios裝置上使用組合語言。一 建立彙編原始檔 在你的xcode專案中存放原始檔的目錄下滑鼠 或觸控板 右鍵,選擇new file。然後在左側的ios那欄裡選擇other,在右邊你會看到assembly file,選中它,然後命名,以.s作為字尾。二 編寫彙編 然後...
Debug的使用 《組合語言》學習筆記
說明 括號內的紅色為助記。一 什麼是debug debug是dos windows提供的實模式 8086方式 程式的除錯工具。使用它,可以檢視cpu各種暫存器的內容 記憶體的情況和在機器碼級跟蹤程式的執行。二 常用的debug功能 用debug的 r命令 register 檢視 改變cpu暫存器的內...
使用組合語言解決除法溢位問題
1 assume cs code23 code segment 4start 5mov ax,4240h 6mov dx,000fh 7mov cx,0ah89 call divdw 1011 movax,4c00h 12int 21h1314 名稱 divdw15 功能 進行不會產生溢位的除法運算...