2011-03-20 126 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)发送。