babu61509 散播福音的祭司
註冊時間: 2007-08-26 文章: 142
681.01 果凍幣
|
發表於: 2008-7-25, AM 9:42 星期五 文章主題: [C][MASM] 教你看懂指令行 ! 新手必看 ?! (用c和組語作範例) |
|
|
這篇是以前寫的(2,3年了吧)...
所以可能會有些怪怪的地方,覺得怪怪就說一下吧!
我個人是覺得對於初學者想看懂指令有一定的幫助啦... 0 3 0
-----------------------------------------------------------------------
正文開始
1.每種程式語言都有其基本架構,大家在學的時候要先把基本架構記下來喔~
以C為例 :
代碼: |
#include <...[前置檔]>
int main()
{
...[程式段]
}
|
以組合語言為例 :
代碼: |
.model small
.stack 100h
.data
...[資料段]
.code
mov ax,@data
mov ds,ax
...[程式段]
mov ah,4ch
int 21h
end
|
2.再來學的是其基本變數,以及常數宣告 :
以C為例 :
引言回覆: |
int (變數名稱); 整數宣告
char (變數名稱); 字元宣告
float (變數名稱); 浮點數(有小數點的數,佔 32 bits)宣告
double (變數名稱); 同上(佔 64 bits)
|
以組合語言為例 :
引言回覆: |
(變數名稱) db (初始值) Byte長度資料宣告(8 bits)
(變數名稱) dw (初始值) Word長度宣告(16 bits)
(變數名稱) dd (初始值) Double Word長度宣告(32 bits)
|
3.然後就是學看懂指令行(就是一行程式碼) :
其實每種程式語言的程式碼中的每一行都不外乎分成 "指令" ,"物件" ,"指令架構" 3個部分
在這之前要先來瞭解程式碼的指令行結構(以c和組語為例),大概可以分成2種,不過還是要看指令用法 :
一般型 : (大部分的指令行結構)
指定型 : (大部分是將右邊的物件指定給左邊的)
以C為例 :
一般型 :
引言回覆: |
int bb; int 是指令,bb; 是物件和指令架構
if (a>b); if 是指令,(a>b); 是物件和指令架構
for (i=1;i<=10;i++){;} for 是指令,(i=1;i<=10;i++){;} 是物件和指令架構
|
指定型 :
引言回覆: |
a = b + c; = 是指令,a和b+c;是物件和指令架構
|
以組合語言為例 :
一般型 :
引言回覆: |
mov ax,4 mov 是指令,ax,4 是物件和指令架構
add bx,3 add 是指令,bx,3 是物件和指令架構
sub cx,1 sub 是指令,cx,1 是物件和指令架構
|
指定型 :
引言回覆: |
k dw 66666666h dw是指令,k和66666666h是物件和指令架構
|
(1)指令 : 就是指要用什麼方法來做事 :
以C為例 :
代碼: |
if 是判斷,int 是宣告整數,for 是要跑迴圈
|
以組合語言為例 :
代碼: |
mov 是搬資料,add 是要加,sub 是要減
|
(2)物件 : 知道要做什麼動作以後,總要有個被處理的東西吧,就是指那個.( 以開門這個動作來說,開這個動作就是指令,門就是被"開"的物件 )
引言回覆: |
int bb; 宣告一個名為bb的整數.(bb就算是物件,被宣告的變數名)
if (a>b); 判斷a是否大於b .(a>b就算是物件,被運算的式子)
for (i=1;i<=10;i++){;} 先設i=1然後判斷i是否<=10 ,是的話就執行{;}內的程式,然後再執行i++,再繼續判斷 i是否<=10 .....等到i不<=10就結束迴圈了. (i=1 ,i<=10 和 i++都算是物件[也算是另外的指令行])
|
引言回覆: |
mov ax,4 把4搬到ax去,也就是設定ax為4 (ax 和 4 都是物件)
add bx,3 將bx加3 (bx 和 3 都是物件)
sub cx,1 將cx減1 (cx 和 1 都是物件)
|
(3)指令架構 : 使用指令的格式符號,這是各程式語言規定的,有些指令也會有其特別的格式
引言回覆: |
int bb; 分號就是指令架構
if (a>b); 括號,分號都是指令架構
for (i=1;i<=10;i++){;} 空格, ( ; ; ) { ; } 都是指令架構
|
引言回覆: |
mov ax,4 逗號就是指令架構
add bx,3 逗號就是指令架構
sub cx,1 逗號就是指令架構
|
4.寫作程式之前,要先有一個目的(這程式要做什麼用?),然後再一步一步用程式行寫出來,寫完就是一個程式了(有問題就準備殺蟲劑吧 A_A Debug...除錯)
以C為範例 :
代碼: |
題目(輸入 2 個整數,並算出他們的加減乘除)
|
(1)嗯...先把基本架構打進去!
代碼: |
int main()
{
return 0;
}
|
(2)要輸入2個整數,先宣告2個變數來放吧~
代碼: |
int main()
{
int x,y; // 宣告整數變數 x 和 y
return 0;
}
|
(3)再來是輸入函數 scanf(),要記得先加前置檔(引入) stdio.h,然後,整數是用 %d,scanf()後面的變數記得要加上 & (找出變數的記憶體位置給輸入的數放) ~
代碼: |
#include <stdio.h>
int main()
{
int x,y; // 宣告整數變數 x 和 y
scanf("%d %d",&x,&y);
return 0;
}
|
(4)直接空白輸入好像怪怪的 ? 前面加個顯示 "請輸入2個整數" 好了...
代碼: |
#include <stdio.h>
int main()
{
int x,y; // 宣告整數變數 x 和 y
printf("請輸入2個整數 : ");
scanf("%d %d",&x,&y); // 輸入x 和 y
return 0;
}
|
(5)再來就~邊算邊印出來囉!要記得換行(\n)比較好看喔~裡面有幾個 %d 後面就要有幾個變數喔!!
代碼: |
#include <stdio.h>
int main()
{
int x,y; // 宣告整數變數 x 和 y
printf("請輸入2個整數 : ");
scanf("%d %d",&x,&y); // 輸入x 和 y
printf("%d + %d = %d\n ",x,y,x+y); // 算出並印出 x + y
printf("%d - %d = %d\n ",x,y,x-y);
printf("%d * %d = %d\n ",x,y,x*y);
printf("%d / %d = %d\n ",x,y,x/y);
return 0;
}
|
(7)完成~
以組語為範例 :
代碼: |
題目(1+2+3+...+10 的和為 ? 請宣告一個變數 s 並將和放到 s 內,再用debug查看)
|
(1)嗯...還是先把架構打進去!
代碼: |
.model small
.stack 100h
.data
.code
mov ax,@data
mov ds,ax
mov ah,4ch
int 21h
end
|
(2)宣告s,用dw應該夠了;初始值用 0,再加個 k = 66666666h 方便debug看好了
代碼: |
.model small
.stack 100h
.data
k dd 66666666h ; 方便用
s dw 0 ; 和的家~16 bits大,放1加到10應該夠了
.code
mov ax,@data
mov ds,ax
mov ah,4ch
int 21h
end
|
(3)1+2+...+10 嗯~要用loop去跑,loop每跑一圈會從cx減一,就設10剛剛好就會從10+9+8+7...+1 跑下來,再加到s變數就可以了!
代碼: |
.model small
.stack 100h
.data
k dd 66666666h ; 方便用
s dw 0 ; 和的家~16 bits大,放1加到10應該夠了
.code
mov ax,@data
mov ds,ax
mov cx,10 ; cx 設為10
a: add s,cx ; 把 cx 加到s
loop a ; cx 減一,然後判斷是否為0,是的話就往下一行執行,不是的話就跳到 a: 標籤去執行
mov ah,4ch
int 21h
end
|
(4)結束 ~ _________________ 已經畢業了!! |
|