assembly main,Main,S_LOOP

时间:2016-11-22 16:57:47

标签: assembly x86

如果你能"翻译"对我来说这部分代码。我把它从我在学校的代码中分开了。我生病了,我没有看过我的课,现在我有一个空白(因为我失去了教训),我无法理解我尝试上网但我失败了。如果你能从中理解这些并给我回答我会很高兴

main proc

1)汇编中main proc是什么?它有什么作用?我该怎么做到这一点?

MAIN endp

2)与之前相同。为什么主要资本化?

findchar PROC 

3)findchar是指尝试查找char,但是PROC?

 S_LOOP
 LOOP S_LOOP

4)这是什么循环?

findchar endp

5)当我们找到char时,MAIN会结束,对吧?

soros segment stack

6)这对堆栈有什么作用?至于我的代码:

ASSUME CS:KODIKAS, DS:DEDOMENA, ss:soros

*

Buffer 40DB dub(0)

7)它用于"消息"?

 db 256 dup(0)

8)同样用小写字母和256?什么是256? :/

它的希腊语

TITLE SIMPLE_ADD
KODIKAS SEGMENT
    ASSUME CS:KODIKAS, DS:DEDOMENA,ss:soros
    ARXI: 
    main proc  
        MOV AX,DEDOMENA 
   MOV DS,AX 

   MOV SI,0

        LEA DX,MINIMA
        MOV AH,9
        INT 21H




     XANA:
       MOV AH,1
       INT 21H      

       CMP AL,35 ;GIA ENTER
       JE CHECK 



  SAVE:
     MOV BUFFER[SI],AL
     INC SI

     CMP SI,80
     JB XANA


     CHECK:
       call findchar

       MOV AH,4CH 


       INT 21H 
       MAIN endp

    findchar PROC    ;uporoutina  
        MOV CX,SI
        JCXZ EXIT
        MOV SI,0
        LEA DX,MINIMA2
        MOV AH,9
        INT21H

        MOV ah,1
        INT 21h
        MOV BL,0
        MOV DL,AL





 findchar proc 
   MOV CX,SI
   JCXZ EXIT
   MOV SI,0
   mov bl,0

   LEA DX,MINIMA2
   MOV AH,9
   INT 21H
   mov ah,1
   int21h

  S_LOOP
         cmp al, BUFFER[SI]  
         jne next
         inc bl  



           next:  



     inc si 


      LOOP S_LOOP

     MOV bl,0 
     je nochar

     lea dx,yparxei
     mov ah,9
     int 21h

     cmp bl,9
     ja dipsifios
     mov dl,bl
     add dl,48
     mov ah,2
     int 21h 

     ret


     dipsifios: 


      MOV al,bl
      mov ah,0   
      mov cl,10
      div cl

      mov ch,ah  

      mov dl,al
      add dl,48   
      mov ah,2
      int 21h




         ret



      nochar:     ;den uparxei


      LEA DX,MINIMA3
      MOV AH,9
      INT21H



findchar endp         









KODIKAS ENDS

DEDOMENA SEGMENT  
    BUFFER 40DB dub(0)



    MINIMA1 DB 10,13, "Eisagete keimeno : $"   
    MINIMA2 DB 10,13,"Eisagete char gia anazitisi :$"
    MINIMA3 DB 10,13,"Den yparxei kanenas xaraktiras :$"  
    YPARXEI DB 10,13,"O xarakthras yparxei fores : $"
  BUFFER DB 80 DUP(0)
DEDOMENA ENDS
soros segment stack
    db 256 dup(0)


    END ARXI 

1 个答案:

答案 0 :(得分:0)

  

1)2)和3)

这些是emu8086(和MASM / TASM)汇编程序指令,不是x86 machine code的一部分。我不愿意深入研究它们,因为我不再使用它们,你可以轻松地为它们谷歌文档。

此外,符号名称看起来不区分大小写,否则main vs MAIN会在编译期间导致语法错误(这也是我不使用它们的另一个原因)。

对您而言,最重要的一点是,这些不会为CPU生成任何机器代码。它们只是帮助组织源代码,并为汇编程序生成一些符号(标签),因此您可以使用它的符号名称call findchar来处理程序的入口点,并让汇编程序找出第一个距离findchar的指令是将其编码到call指令操作码中。

如果call -87代码在findchar指令之前的84字节开始(IIRC为{{1},那么在没有符号的情况下,您必须手动计算差异并编写例如call。操作码长3个字节,因此84 + 3 = 87)。

  

call
  S_LOOP

LOOP S_LOOP是标签定义,但它最后缺少冒号(S_LOOP),这让我感到困惑,可能是另一种在emu8086中有效的语法怪癖。因此,结果又是汇编程序符号表中的符号。

S_LOOP:是实际的x86指令loop

每当您不确定某些x86指令的作用时,请查看英特尔参考指南中的说明。

  

5)和6)

再次是汇编程序指令,你甚至都不是他们的意思。

顺便说一句,停止猜测汇编程序中的内容意味着什么。这是没用的。在其中一个参考指南中找到它的定义。

汇编程序不像高级语言,被定义为具有良好的可读性。它是硬件设计的CPU指令的别名,并且通常会发生很多微小的细节(通常是出于非常好的理由,可以通过简单的方式在代码中完成某些事情,有时仅仅因为设计它更便宜那)。因此,例如,指令LOOP S_LOOP也将DIV bxax作为输入,并修改dxax。你只有机会从“dx”中猜出来。

(我知道3个不同CPU的汇编,有几种不同的汇编语法方言,但每当我试着猜测不同目标CPU的源代码时,我经常失败并且必须谷歌文档)

  

DIV bx
  7)它的“信息”?

我很确定这不会编译,因为它在语法上是错误的。

原始行非常可能Buffer 40DB dub(0),它使用两个汇编程序指令,定义标签,实际上定义了一个字节值。

Buffer DB 40 DUP (0)是标签定义,再次添加冒号不会造成伤害,实际上它可能在某些情况下有所帮助,所以尽量在Buffer之前使用Buffer:

DB是非常常见的汇编程序指令,可能在所有x86汇编程序中共享。它的意思是“定义字节”。所以它告诉汇编器你将把数字字节值放在它之后,而不是指令助记符,汇编器应该把你提供的值放到机器代码中。

DB是MASM / TASM / emu8086特定指令,告诉编译器多次复制<times> DUP (<value>) <value>,因此您不必手动编写<times>

该行将编译为40个零字节(可能作为某些字符串的缓冲区,我实际上没有检查代码,它做了什么,只有你的问题)。

  

db 256 dup(0)
  8)同样用小写字母和256?什么是256?

大多数汇编程序不区分大小写,因此您可以根据自己的喜好编写指令和指令。因此,DB 0, 0, 0, ..., 0 ; 40 zeroesdbDBdup,两者都在上面解释(这一个将产生256个字节,机器代码中的值为零)。

符号名称不区分大小写有点令人惊讶,如果你认为emu8086试图模仿MASM(Microsoft Assembler),那就再好不过了。