|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2005-12-09, 03:03 AM | #1 |
註冊會員
|
組合語言的問題?
請問這是什麼意思...我剛學...連編譯器都看不懂怎麼用...
星期五12/9 要交作業了...拜託幫個忙吧.. .data x1 QWORD 0A02B000190008400h x2 QWORD 0800187008000A904h sum BYTE 9 DUP(?) 1. Write an assembly program to do an extended addition of two integers 2. You may assume that the two integers are unsigned 3. Use the DumpMem (described in textbook pages 141-146) in Irvine32.inc to display the sum. 4. Note that the integers are stored in little-endian order in the memory. 5. The instructions that may be used : (1.)ADC : Add with carry flag, for example: ADC dest source ; dest = dest + source + CF (2.)CLC : Clear Carry Flag, means Set CF = 0 (3.)STC : Set Carry Flag, means Set CF = 1 |
送花文章: 23,
|
2005-12-09, 09:47 AM | #2 (permalink) |
管理版主
|
老兄的作業期限怎麼都是不到一天...^^||
1.寫一個(擴充式)兩個整數型加法 組合語言 (因為題目是一個 兩個超長整數) 2.您可以假設兩個整數是無符號類形的 (也就是正整數) 3.使用DumpMem 技巧顯示其合(請參考文字書 141頁 -146頁) *DumpMem : 將一段範圍內的記憶體內容以16進位的格式寫入到標準輸出上 4.附註:這個整數資料在記憶體中是以 little-endian (低位組在前)之順序存放 5.可能使用的指令: (1.)ADC : 用進位旗標做加法,例如: ADC dest source ; dest = dest + source + CF (2.)CLC : 清除進位旗標, 意義為 Set CF = 0 (3.)STC : 設定進位旗標, 意義為 Set CF = 1 簡單加法如下 語法:
DATA SEGMENT ;定義了一個資料區段(DATA SEGMENT),來做 X1 DW ? ;為變數X1、X2 的儲存區。 X2 DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA BEGIN PROC FAR MOV AX,X1 ADD AX,X2 BEGIN ENDP CODE ENDS END BEGIN 定為1時,兩數相加結果再加1,如進位旗標被清除為0時就不再加1。 二個雙字組數的高階字組放在BX和DX,低階字組放在AX和CX,兩數相加時只要: 語法:
ADD AX,CX '--|_ BX:AX ADC BX,DX '--| +) DX:CX ' -------- ' BX:AX (也就是BX+AX 有進位的話 BX+DX就會再加一) 參考: http://webbbs.muarock.net/cgi-bin/bb...2E15/AA271209C |
送花文章: 2013,
|
2005-12-14, 12:45 PM | #5 (permalink) |
註冊會員
|
這是朋友傳給我的作業答案~
但是我還是不懂~為什麼要用到EAX EBX ECX EDX 這麼多的指令 語法:
;*****This is Assembly Exam 01***** INCLUDE Irvine32.inc .data x1 QWORD 0A02B000190008400h x2 QWORD 800187008000A904h sum BYTE 9 DUP(?) .code main PROC mov esi,offset sum mov EAX,0 mov EBX,0 mov EDX,0 mov ECX,9 mov EAX,DWORD PTR [x1] add EAX,DWORD PTR [x2] adc DX,0 CLC mov EBX,DWORD PTR [x1+4] add EBX,DWORD PTR [x2+4] add EBX,EDX adc DH,0 mov [esi],EAX mov [esi+4],EBX mov [esi+8],DL mov EDX,0 mov edi,0 L1: movzx EDX,[sum+edi] push EDX inc edi loop L1 mov ECX,9 mov edi,0 L2: pop EDX mov [sum+edi],DL inc edi loop L2 mov esi,offset sum mov ECX,9 call DumpMem call DumpRegs EXIT main ENDP END main |
送花文章: 23,
|
2005-12-14, 03:00 PM | #6 (permalink) |
管理版主
|
那些是暫存器名稱
mov EAX,DWORD PTR [x1] mov 是複製指令 EAX 是32位元 累加暫存器 全名,可容納一個DWORD資料 語法:
31~16 15~08 07~00 bit |--------------------------------| | | AH | AL | <===整個稱為 EAX |--------------------------------| [x1] 表示 x1的記憶體位址 所以 DWORD PTR [x1] 表示指向x1 因為只能存放DWORD長度的資料 所以DWORD PTR [x1] 等於 90008400h 所以: mov EAX,DWORD PTR [x1] 表示把 90008400h 放到 EAX 裡 (DWORD PTR [x1+4] 表示指向x1 再加4byte的位址,等於 A02B0001h) 至於 Q: 為什麼要用到EAX EBX ECX EDX 這麼多的暫存器? A: 因為需要嘛~ ^^|| 比如 loop 迴圈指令會用到 計數暫存器 ECX 執行到 loop 時 ECX=ECX-1 直到 ECX=0 即執行 loop 的下一條指令 (跳脫loop迴圈) 比如 語法:
;計算1加到100 (1+2+3+...+100) start: xor ax , ax ; ax清除為0 mov bx , ax ; bx = 0,bx也清為零 mov cx , 100 ; 設定迴圈次數=100 C_ADD: inc bx ; bx=bx+1 add ax , bx ; ax=ax+bx loop C_ADD ; cx=cx-1且重複count至cx=0 : ; loop結束時ax等於 (1加到100的值) 比如 要將 bl 內容複製到 EAX 裡 bl 只有一個byte長度 EAX 有4個byte長度 此時就用 movzx EAX,bl 這裡有一些教學 http://140.111.104.1/kocp/mpu/m4/m4index.htm |
送花文章: 2013,
|
2005-12-16, 03:38 AM | #7 (permalink) |
註冊會員
|
這是我自己寫的...但是他一直說有錯...我也不會改阿~Q~
拜託~幫個忙吧~小弟萬分感謝~ 語法:
include Irvine32.inc .data x1 QWORD 0A02B000190008400h x2 QWORD 800187008000A904h sum BYTE 9 DUP(?) .code main PROC mov esi,offset sum mov AL,0 mov BL,0 mov CX,9 mov DL,0 mov AH,0 mov BH,0 mov ebp,1 mov edi,0 L1: mov AL,BYTE PTR [x1+edi] mov BL,BYTE PTR [x2+edi] mov DL,AL ADD DL,BL ADC BH,0 add [esi+edi],DL inc edi inc ebp CLC loop L1 call DumpMem call DumpRegs exit main ENDP END main |
送花文章: 23,
|
2005-12-16, 12:59 PM | #8 (permalink) |
管理版主
|
臨時複習了一上午
語法:
include Irvine32.inc .data x1 QWORD 0A02B000190008400h x2 QWORD 800187008000A904h ; 答案是 01202C870210012D04h 共9個Byte sum BYTE 9 DUP(?) ;所以申請9個Byte的記憶體空間 .code main PROC xor eAX,eAX ;清除AX=0 mov eDI,0 ;目的索引暫存器亦清除 mov eCX,9 CLC L1: jnc L2 ;若CF=0則跳到 L2: adc BYTE PTR [sum+eDI],0 ;否則 sum[下一個Byte]=sum[下一個Byte]+1 CLC ;清除進位旗標 CF=0 L2: mov AL,BYTE PTR [x1+eDI] ;AL=[x1+eDI] add AL,BYTE PTR [x2+eDI] ;AL=AL+[x2+eDI] mov BYTE PTR [sum+eDI],AL ;結果放到 sum inc eDI ;做下一個Byte loop L1 ;傾印記憶體內容 mov eSI,offset sum mov CX,9 call DumpMem call DumpRegs exit main ENDP END main 不過邏輯應該沒錯 解說: |
送花文章: 2013,
|
2005-12-16, 04:21 PM | #10 (permalink) |
管理版主
|
http://www.uploadtemple.com/view.php/1134721265.jpg
剛剛發現有一點錯 你可試試找出來 mov BYTE PTR [sum+eDI],AL ;結果放到 sum 改成 add BYTE PTR [sum+eDI],AL ;結果放到 sum 因為這樣才不會把 adc BYTE PTR [sum+eDI],0 預先做的進位破壞掉 還有 sum BYTE 9 DUP(?) 改成 sum BYTE 9 DUP(0) 為了不使進位的情形發生 |
送花文章: 2013,
|