2011-03-20 128 views
2

我是新來的彙編語言,這是一些代碼,我不明白希望有人會幫助它。彙編8086程序

DATA SEGMENT 
    VALUES DB 1,2,3,4,5,6,7,8,9 
    ITEM DB 6 
DATA ENDS 
CODE SEGMENT 
    ASSUME CS:CODE,DS:DATA 
START: MOV AX,DATA 
     MOV DX,AX 
     LEA SI,VALUES 
     MOV AL,ITEM 
COMPARE: CMP AL,[SI] 
     JZ Found 
     INC SI 
     LOOP COMPARE 
     CLC 
     JMP EXIT 
Found: STC 
EXIT: MOV AH,4CH 
     INT 21H 
     ENDS 
CODE END 

這個程序應該是尋找數(6)1,2,3,4,5,6,7,8,9

我理解它是如何工作一般,但我有幾個問題:

  1. 爲什麼要用CLCSTC? ?我知道他們把CF分爲零和一個,但爲什麼我們使用它?
  2. 爲什麼我們在EXIT標籤後面使用MOV AH,4CH
  3. 起始標籤爲什麼我們以下後:

    MOV AX,DATA
    MOV DX,AX

爲什麼我們不只是MOV DX,DATA

最後,有人可以建議一本好書學習大會?

+0

哦,小子! 3位編輯馬上! = P我保留了本書的推薦位。 – gideon 2011-03-20 08:46:03

+0

搜索SO for book建議參見:[SO忍者搜索](http://www.google.com/search?q=book+for+assembly+language&sitesearch=stackoverflow.com/questions&qscrl=1) – gideon 2011-03-20 08:46:28

+0

LOOP是286+,反正你不會在任何地方啓動cx。 – bestsss 2011-03-20 09:13:03

回答

1

該算法搜索數字列表中的數字。

如果找到,則設置爲CF。如果未找到,則清除CF

INT 21H是MS-DOS服務中斷。功能4Ch用AL中的錯誤代碼(包含要找到的號碼)結束程序。

DATA SEGMENT 
    VALUES DB 1,2,3,4,5,6,7,8,9 
    ITEM DB 6 
DATA ENDS 
CODE SEGMENT 
    ASSUME CS:CODE,DS:DATA 
START: MOV AX,DATA 
     MOV DX,AX 
     LEA SI,VALUES   ; DS:SI points to the VALUES structure 
     MOV AL,ITEM 
COMPARE: CMP AL,[SI]   ; Compare with number in list 
     JZ Found    ; Jump to Found if equal 
     INC SI    ; Try next 
     LOOP COMPARE   ; 
     CLC     ; Clear CF (not found) 
     JMP EXIT    ; Quit 
Found: STC      ; Set CF (found) 
EXIT: MOV AH,4CH    ; End program with error code AL = 6. 
     INT 21H 
     ENDS 
CODE END 
+0

我在問題中提到,但LOOP是286,可能你想CMP CMP,XXX(可能是ITEM的addr)和jnz,而不是循環。在這種情況下,SCASB可能也是最好的。 – bestsss 2011-03-20 09:17:22

0
MOV AX,DATA 
MOV DX,AX 

是錯誤的。它必須是:

MOV AX,DATA 
MOV DS,AX 

我們寫的數據段的DS寄存器的地址,讓CPU知道去哪個地址尋找我們的數據。由於x86指令集的限制,我們不能寫MOV DS,DATA,即在CPU中沒有實現這樣的功能。每當將段地址寫入段寄存器時,必須使用AX作爲介質。

0

LOOP指令很好奇。該指令遞減CX,並且僅在CX不爲零時跳轉。這意味着循環運行CX次,但CX永遠不會被程序設置。

CX是入境可能是0,而第一減量將使65535,所以它實際上將循環最大的65536倍,搜索過去的列表的末尾如果沒有找到的元素。

要使其正確無誤,請在循環開始前添加MOV CX, ITEM - VALUES。由於ITEM緊接在VALUES後面,因此減去它們的地址將給出列表中的字節數(元素)。

通常會將標籤添加到列表的末尾以使這樣的計算更加健壯。

  VALUES  DB 1,2,3,4,5,6,7,8,9 
     VALUES_END LABEL BYTE 
     ; ... 

     MOV CX, VALUES_END - VALUES 
COMPARE: ; ... 
     LOOP COMPARE 
1
MOV AX,DATA 

MOV DX,AX 

這是不對的。

正確答案是:

MOV AX,DATA 

MOV DS,AX 

我們不能從存儲器至段寄存器(DS)直接發送數據。所以我們通過通用寄存器(AX)發送。