關於組合語言

不知道有沒有大大對組合語言比較有研究的
我之前其實學過一些些,2004的時候...
但是我那時候是用模擬器來simulate的

可是現在老師是要我們用visual studio.net來寫

就完全不知道要怎麼去用了

而且是要寫while loop 跟 if

我有寫出c的版本

int gcd(int m, int n)
/* precondition: m>0 and n>0. Let g=gcd(m,n). */
{ while( m > 0 )
{ /* invariant: gcd(m,n)=g */
if( n > m )
{ int t = m; m = n; n = t; } /* swap */
/* m >= n > 0 */
m -= n;
}
return n;
}

可是不知道是現在太晚還是怎樣
完全想不出應該要怎樣用assembly 的add and 等東西來寫...

不知道有沒有大大可以給一些小小的暗示\頭緒

老師給的
int GCD (int number1, int number2)<<<是要把這2個當input嗎?
{
int output_number;
__asm
{
// START CODING HERE
// you're supposed to check the sign of given integer numbers
// if one of them is negative or zero, you must return -1

// don't forget to move result to output_number
// END CODING HERE
}

return output_number;
}


這是我以前用notepad寫的一部份
;;; Code to call subsub with inputs in x3100, x3101
.ORIG x3000
LD R6, STACK ; INITIALIZE THE STACK POINTER
LDI R0, INPUT1 ; AND LOAD THE ARGUMENTS
LDI R1, INPUT2
;; Now call the subsub routine
;; PUSH ARGS ONTO STACK, R1 THEN R0
ADD R6, R6, #-1
STR R1, R6, #0
ADD R6, R6, #-1
STR R0, R6, #0
;; THEN CALL THE SUBROUTINE
JSR RDNUM
LDR R2, R6, #0 ; GET THE RETURN VALUE
ADD R6, R6, #3 ; 2 PARAMS + RETURN VALUE
;; Finally, halt the program
HALT
INPUT1 .FILL x3100
INPUT2 .FILL x3101
STACK .FILL x4000 ; put the stack at 4000

這裡面有Input的部份
那我是要把input1
input2 改成number1, number2 來接收input嗎?

我要不要initialize勒?
要specify 用的register嗎? 不是R0~7
是x3000.........

拜託各位大大了
我真的是一點頭绪都沒有
2006-01-26 19:20 發佈
文章關鍵字 組合語言
蠻久沒用ASSEMBLY 不過要寫IF 和 WHILE LOOP 的話應該要用BRANCH, 到GOOGLE 上找一下ASSEMBLY的BRANCH 怎麼用。都沒頭緒的話我再幫你想想
嗯.. @@

之前學 MASM,套用教科書上給的 Macro,Loop 是用一個 Register 的值去比對的
就是.. 每個 Loop 會將 Register +1 然後比對值是否相同


不過真的.. 很久沒碰了,目前也是完全忘記的狀態 Orz
http://about.me/cornguo
終於把第一部分寫出來了

int GCD (int number1, int number2)
{
int output_number;
__asm
{
// START CODING HERE
// you're supposed to check the sign of given integer numbers
// if one of them is negative or zero, you must return -1
//initialize
WHILELOOP: MOV eax,number1
MOV ebx,number2
//compare
CMP eax,0;
CMP ebx,eax;
//Jump if ebx(number2) is bigger then eax(number1)
JLE SWAP;
SUB eax,ebx;
MOV output_number,eax;
//make sure eax(number1)>ebx(number2)>0
SWAP: MOV ecx,eax;
MOV eax,ebx;
MOV ebx,ecx;
JMP WHILELOOP;
// don't forget to move result to output_number
// END CODING HERE
}

return output_number;
}

syntax應該是沒有錯....
可是完全不知道會不會work.....
好像是不work.....>"<
Noooooooooooooooooooooooooooooooooooooooooooooooo


因為第二部分還沒寫出來 ....Orz
剛剛還在想什麼叫做組合語言原來是說機械語言
以前學過現在忘了....
沒錯我是來鬧的~


基本上第二個部分就只是
用move把有n的值移到return register (r14 ???)
然後在branch到return register's address (caller)
以上是我是用猜的...因為compiler差很多
第二部分是這個

/*
Fibonacci Algorithm:
Fib(n) = 0 when n = 0
= 1 when n = 1
= Fib(n-1) + Fib(n-2) when n >= 2

For detail algorithm, please check out the following link:
http://www.brpreiss.com/books/opus4/html/page73.html
*/
int Fibonacci ( int number )
{
int output_number;
__asm
{
// START CODING HERE
// you're supposed to check the sign of a given integer number
// if number is negative, you must return -1
ADD R0, R2, #0
// don't forget to move result to output_number
// END CODING HERE
}
return output_number;
}



啊.. 那個應該不是機械語言啦.. @@

機械語言是只有 0 跟 1 的東西

組合語言是 Assembly Language, not Machine Language
http://about.me/cornguo
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?