2

我是汇编语言的新手,这是一些我不明白的代码,希望有人能帮忙。

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. 为什么我们在标签MOV AH,4CH后使用in EXIT??
  3. 在开始标签之后为什么我们要说以下内容:

    MOV AX,DATA
    MOV DX,AX

我们为什么不直接MOV DX,DATA

最后,有人可以推荐一本学习汇编的好书吗?

4

5 回答 5

2
MOV AX,DATA

MOV DX,AX

这是错误的。

正确答案是:

MOV AX,DATA   

MOV DS,AX

我们不能直接将数据从内存发送到段寄存器(DS)。所以我们通过通用寄存器(AX)发送。

于 2011-04-21T00:48:37.667 回答
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
于 2011-03-20T08:49:24.780 回答
1

这里的LOOP指令很奇怪。该指令CX仅在CX不为零时递减和跳转。这意味着循环运行CX多次,但CX从未由程序设置。

CX输入时可能为零,第一次减量将使其变为 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
于 2011-03-20T09:05:10.110 回答
0
MOV AX,DATA
MOV DX,AX

是错的。肯定是:

MOV AX,DATA
MOV DS,AX

我们将数据段的地址写入DS寄存器,以便 cpu 知道去哪个地址查找我们的数据。MOV DS,DATA而且由于x86指令集的限制,我们不能写,即CPU中没有实现这样的功能。AX每当将段地址写入段寄存器时,您都必须将其用作媒介。

于 2011-03-20T08:55:29.360 回答
0
  • CLC指令用于“清除进位标志”,STC用于“设置进位标志”。这些是过程控制指令,用于通过设置/重置标志值来控制处理器动作。
  • 在 ALP 中,我们只能将数据加载到段寄存器中,首先将其加载到通用寄存器中,然后我们必须将其从该通用寄存器移动到段寄存器中,这就是语法...
  • MOV AH,4CH用于终止当前进程。通过将(移动=MOV)的十六进制值存储4CHAH寄存器中。
MOV AX,DATA 
MOV DS,AX 
  • MOV AX,DATA指令是在ax中加载数据段起始地址的方式。然后通过使用MOV DS,AX,数据段被初始化。
于 2021-06-07T11:06:48.607 回答