Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编8086程序_Assembly_X86 16 - Fatal编程技术网

Assembly 汇编8086程序

Assembly 汇编8086程序,assembly,x86-16,Assembly,X86 16,我不熟悉汇编语言,这是一些我不懂的代码,希望有人能帮我 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 F

我不熟悉汇编语言,这是一些我不懂的代码,希望有人能帮我

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
这个程序应该在
1,2,3,4,5,6,7,8,9

我了解它的工作原理,但我有几个问题:

  • 为什么我们要使用
    CLC
    STC
    ??我知道他们把
    CF
    归为0和1,但我们为什么要用它呢
  • 为什么在
    退出
    标签之后使用
    MOV-AH,4CH
    in
  • 在开始标签之后,我们为什么说:

    移动轴,数据
    MOV-DX,AX

  • 我们为什么不说:
    MOV-DX,数据


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

    该算法在数字列表中搜索一个数字

    如果找到,则设置
    CF
    。如果未找到,则清除
    CF

    INT 21H是MS-DOS服务中断。函数4Ch以AL中的错误代码(包含要查找的编号)结束程序

    这是错误的。它必须是:

    MOV AX,DATA
    MOV DS,AX
    

    我们将数据段的地址写入
    DS
    寄存器,以便cpu知道要查找数据的地址。由于x86指令集的限制,我们无法编写
    movds,DATA
    ,也就是说CPU中没有实现这样的功能。每当将段地址写入段寄存器时,必须使用
    AX
    作为介质。

    这里的
    循环
    指令很奇怪。仅当
    CX
    不为零时,此指令才会递减
    CX
    ,并跳转。这意味着循环运行
    CX
    次,但程序从未设置
    CX

    CX
    在输入时很可能为零,第一个减量将使其为65535,因此它实际上将最多循环65536次,如果找不到元素,则搜索超过列表末尾

    要使其正确,请在循环开始之前添加
    MOV-CX,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
    
    这是错误的

    正确答案是:

    MOV AX,DATA   
    
    MOV DS,AX
    
    我们不能直接将数据从内存发送到段寄存器(DS)。因此,我们通过通用寄存器(AX)发送数据。

    • CLC
      指令用于“清除进位标志”,而
      STC
      指令用于“设置进位标志”。这些是过程控制指令,用于通过设置/重置标志值来控制处理器操作
    • 在ALP中,我们只能通过以下方式将数据加载到段寄存器中:首先将其加载到通用寄存器,然后我们必须将其从通用寄存器移动到段寄存器,这就是语法的方式
    • MOV-AH,4CH
      用于从当前进程终止。通过将
      4CH
      的十六进制值存储(move=MOV)到
      AH
      寄存器中
    • MOV-AX,DATA
      指令是在AX中加载数据段起始地址的方法。然后使用
      movds,AX
      ,初始化数据段

    哦,孩子!一次三个编辑=P我保留了图书推荐位。搜索图书推荐请参见:LOOP是286+,无论如何都不能初始化cx。@bestsss:
    LOOP
    绝对不是286+。所有形式的
    循环
    都是8086级指令。然而,
    cx
    缺少初始化是正确的。我在问题下面提到过,但是循环是286,可能您想要CMP SI、XXX(可能是项目的addr)和jnz,而不是循环。在这种情况下,SCASB可能是最好的。
    mov-DS,immediate
    不能作为x86机器指令编码,但源代码必须是GP寄存器这一点并不完全正确。它还可以
    move es,[bx]
    从内存进入段寄存器(),甚至
    pop-ds
    进入段寄存器。这在这里对
    数据
    段没有用处,但是您的语句并没有局限于该用例。另外,
    mov-ah,4Ch
    本身并没有终止程序。
    int21h
    处理程序在AH中查找呼叫号码;这就是在运行
    int21h
    之前将其设置为DOS呼叫号码的原因。
             VALUES     DB 1,2,3,4,5,6,7,8,9
             VALUES_END LABEL BYTE
             ; ...
    
             MOV CX, VALUES_END - VALUES
    COMPARE: ; ...
             LOOP COMPARE
    
    MOV AX,DATA
    
    MOV DX,AX
    
    MOV AX,DATA   
    
    MOV DS,AX
    
    MOV AX,DATA 
    MOV DS,AX