史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   組合語言的問題? (http://forum.slime.com.tw/thread162904.html)

kinco 2005-12-09 03:03 AM

組合語言的問題?
 
請問這是什麼意思...我剛學...連編譯器都看不懂怎麼用...
星期五12/9 要交作業了...拜託幫個忙吧.. :decfghi6:

.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

mini 2005-12-09 09:47 AM

老兄的作業期限怎麼都是不到一天...^^||
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

kinco 2005-12-09 12:46 PM

感恩你的大恩大德...QQ"
因為每次我都忘記有作業~ :decfghi6:
總之~非常謝謝~你的幫忙~ :bj375mg:

snoopy 2005-12-09 04:14 PM

引用:

作者: kinco
因為每次我都忘記有作業~ :decfghi6:

跟我一樣耶 :wertyh: :n6: :n6: :n6:

kinco 2005-12-14 12:45 PM

這是朋友傳給我的作業答案~
但是我還是不懂~為什麼要用到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


mini 2005-12-14 03:00 PM

那些是暫存器名稱

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

kinco 2005-12-16 03:38 AM

這是我自己寫的...但是他一直說有錯...我也不會改阿~Q~ :decfghi6:
拜託~幫個忙吧~小弟萬分感謝~
語法:

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


mini 2005-12-16 12:59 PM

臨時複習了一上午

語法:

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

kinco 2005-12-16 03:02 PM

感恩~大俠屢次仗義相助...
小弟銘感五內...
但是下面的圖片太小 看不清楚~可否放大~ 非常感謝~

mini 2005-12-16 04:21 PM

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)
為了不使進位的情形發生


所有時間均為台北時間。現在的時間是 11:57 AM

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

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1