史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2005-12-09, 03:03 AM   #1
kinco
註冊會員
榮譽勳章
UID - 248756
在線等級: 級別:8 | 在線時長:113小時 | 升級還需:4小時級別:8 | 在線時長:113小時 | 升級還需:4小時級別:8 | 在線時長:113小時 | 升級還需:4小時
註冊日期: 2003-02-06
VIP期限: 2007-04
住址: 台北.中和
文章: 507
精華: 0
現金: 0 金幣
資產: 670 金幣
預設 組合語言的問題?

請問這是什麼意思...我剛學...連編譯器都看不懂怎麼用...
星期五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
kinco 目前離線  
送花文章: 23, 收花文章: 5 篇, 收花: 9 次
回覆時引用此帖
舊 2005-12-09, 09:47 AM   #2 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時
註冊日期: 2002-12-07
文章: 13250
精華: 0
現金: 26242 金幣
資產: 3024052 金幣
預設

老兄的作業期限怎麼都是不到一天...^^||
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
ADC是將來源和目的運算元相加外再加上進位旗標(CF)的值,亦即,如進位旗標被設
定為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
mini 目前離線  
送花文章: 2000, 收花文章: 7958 篇, 收花: 26750 次
回覆時引用此帖
舊 2005-12-09, 12:46 PM   #3 (permalink)
註冊會員
榮譽勳章
UID - 248756
在線等級: 級別:8 | 在線時長:113小時 | 升級還需:4小時級別:8 | 在線時長:113小時 | 升級還需:4小時級別:8 | 在線時長:113小時 | 升級還需:4小時
註冊日期: 2003-02-06
VIP期限: 2007-04
住址: 台北.中和
文章: 507
精華: 0
現金: 0 金幣
資產: 670 金幣
預設

感恩你的大恩大德...QQ"
因為每次我都忘記有作業~
總之~非常謝謝~你的幫忙~
kinco 目前離線  
送花文章: 23, 收花文章: 5 篇, 收花: 9 次
回覆時引用此帖
舊 2005-12-09, 04:14 PM   #4 (permalink)
註冊會員
 
snoopy 的頭像
榮譽勳章
UID - 33737
在線等級: 級別:49 | 在線時長:2676小時 | 升級還需:24小時級別:49 | 在線時長:2676小時 | 升級還需:24小時級別:49 | 在線時長:2676小時 | 升級還需:24小時級別:49 | 在線時長:2676小時 | 升級還需:24小時
註冊日期: 2003-02-02
VIP期限: 2011-06
住址: 台南共和國
文章: 1831
精華: 0
現金: 12744 金幣
資產: 12834 金幣
預設

引用:
作者: kinco
因為每次我都忘記有作業~
跟我一樣耶
snoopy 目前離線  
送花文章: 623, 收花文章: 392 篇, 收花: 1288 次
回覆時引用此帖
舊 2005-12-14, 12:45 PM   #5 (permalink)
註冊會員
榮譽勳章
UID - 248756
在線等級: 級別:8 | 在線時長:113小時 | 升級還需:4小時級別:8 | 在線時長:113小時 | 升級還需:4小時級別:8 | 在線時長:113小時 | 升級還需:4小時
註冊日期: 2003-02-06
VIP期限: 2007-04
住址: 台北.中和
文章: 507
精華: 0
現金: 0 金幣
資產: 670 金幣
預設

這是朋友傳給我的作業答案~
但是我還是不懂~為什麼要用到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
kinco 目前離線  
送花文章: 23, 收花文章: 5 篇, 收花: 9 次
回覆時引用此帖
舊 2005-12-14, 03:00 PM   #6 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時
註冊日期: 2002-12-07
文章: 13250
精華: 0
現金: 26242 金幣
資產: 3024052 金幣
預設

那些是暫存器名稱

mov EAX,DWORD PTR [x1]

mov 是複製指令
EAX 是32位元 累加暫存器 全名,可容納一個DWORD資料
語法:
   31~16  15~08 07~00 bit
|--------------------------------|
|              |  AH  |  AL  | <===整個稱為 EAX
|--------------------------------|
DWORD PTR 一個雙字組(32bit)指標,指向後面變數的 記憶體位址
[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的值)
movzx 指令 (複製較小值到較大值)
比如
要將 bl 內容複製到 EAX 裡
bl 只有一個byte長度
EAX 有4個byte長度
此時就用
movzx EAX,bl

這裡有一些教學
http://140.111.104.1/kocp/mpu/m4/m4index.htm
mini 目前離線  
送花文章: 2000, 收花文章: 7958 篇, 收花: 26750 次
回覆時引用此帖
舊 2005-12-16, 03:38 AM   #7 (permalink)
註冊會員
榮譽勳章
UID - 248756
在線等級: 級別:8 | 在線時長:113小時 | 升級還需:4小時級別:8 | 在線時長:113小時 | 升級還需:4小時級別:8 | 在線時長:113小時 | 升級還需:4小時
註冊日期: 2003-02-06
VIP期限: 2007-04
住址: 台北.中和
文章: 507
精華: 0
現金: 0 金幣
資產: 670 金幣
預設

這是我自己寫的...但是他一直說有錯...我也不會改阿~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
kinco 目前離線  
送花文章: 23, 收花文章: 5 篇, 收花: 9 次
回覆時引用此帖
舊 2005-12-16, 12:59 PM   #8 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時
註冊日期: 2002-12-07
文章: 13250
精華: 0
現金: 26242 金幣
資產: 3024052 金幣
預設

臨時複習了一上午

語法:
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
組譯起來對不對 個人不敢作保證 (沒安裝ASM)
不過邏輯應該沒錯
解說:
http://fapomatic.com/50/add_test1.jpg
mini 目前離線  
送花文章: 2000, 收花文章: 7958 篇, 收花: 26750 次
回覆時引用此帖
舊 2005-12-16, 03:02 PM   #9 (permalink)
註冊會員
榮譽勳章
UID - 248756
在線等級: 級別:8 | 在線時長:113小時 | 升級還需:4小時級別:8 | 在線時長:113小時 | 升級還需:4小時級別:8 | 在線時長:113小時 | 升級還需:4小時
註冊日期: 2003-02-06
VIP期限: 2007-04
住址: 台北.中和
文章: 507
精華: 0
現金: 0 金幣
資產: 670 金幣
預設

感恩~大俠屢次仗義相助...
小弟銘感五內...
但是下面的圖片太小 看不清楚~可否放大~ 非常感謝~
kinco 目前離線  
送花文章: 23, 收花文章: 5 篇, 收花: 9 次
回覆時引用此帖
舊 2005-12-16, 04:21 PM   #10 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時級別:96 | 在線時長:9667小時 | 升級還需:130小時
註冊日期: 2002-12-07
文章: 13250
精華: 0
現金: 26242 金幣
資產: 3024052 金幣
預設

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)
為了不使進位的情形發生
mini 目前離線  
送花文章: 2000, 收花文章: 7958 篇, 收花: 26750 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 04:57 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1