2016-05-17 159 views
0

我真的是汇编语言的初学者。我对语法知之甚少。我在网上学习它,但我无法很好地理解它。我发现一个样本问题需要试验,但不能真正理解如何去做。更大,小于或等于汇编语言?

这里就是你给出个字符的两个字符串,这是我们应该称其为问题

和B. A为最多5个字符长和B最长255个字符。编写一个汇编语言程序,它将计算字符串B中字符串A的出现次数,并将结果留给AL​​。因此,如果A是字符串“job”而B是字符串“job I get a job”,那么你的程序应该在AL中留下2。

到目前为止我只能做打印输出和显示字符串。我如何解决涉及数学逻辑的问题?

if AL > 7, display “Greater than Seven!”, 
if AL < 7, display “Less than Seven!”, 
if AL = 7, display “Equal to Seven!”. 

编辑:

我有一个示例代码,但仅适用于字符。我如何将它替换为字符串?

DATA SEGMENT 
    MSG1 DB 10,13, 'ENTER ANY STRING : - $' 
    MSG2 DB 10,13, 'ENTER ANY CHARACTER : -$' 
    MSG3 DB 10,13, ' $' 
    MSG4 DB 10,13, 'NO CHARACTER FOUND IN THE GIVEN STRING $' 
    MSG5 DB ' CHARACTER(S) FOUND IN THE GIVEN STRING $' 
    CHAR DB ? 
    COUNT DB 0 
    P1 LABEL BYTE 
    M1 DB OFFH 
    L1 DB ? 
    P11 DB OFFH DUP ('$') 

DATA ENDS 
DISPLAY MACRO MSG 
    MOV AH, 9 
    LEA DX, MSG 
    INT 21H 
ENDM 

CODE SEGMENT 
    ASSUME CS:COD,DS:DATA 
START: 
     MOV AX,DATA 
     MOV DS,AX 

     DISPLAY MSG1 

     LEA DX,P1 
     MOV AH,0AH 
     INT 21H 

     DISPLAY MSG2 

     MOV AH,1 
     INT 21H 
     MOV CHAR,AL 

     DISPLAY MSG3 

     LEA SI, P11 

     MOV CL,L1 
     MOV CH,0 
CHECK: 
     MOV AL,[SI] 
     CMP CHAR,AL 
     JNE SKIP 
     INC COUNT 
SKIP: 
     INC SI 
     LOOP CHECK 

     CMP COUNT, 0 
     JE NOTFOUND 

     DISPLAY MSG3 

     MOV DL,COUNT 
     ADD DL,30H 
     MOV AH,2 
     INT 21H 

     DISPLAY MSG5 
     JMP EXIT 
NOT FOUND: 
      DISPLAY MSG4 
EXIT: MOV AH, 4CH 
     INT 21H 

CODE ENDS 
END START 
+0

听起来就像你试图编程一个字符串搜索,在汇编。有很多方法可以做到这一点。建议你从天真的字符串搜索开始https://en.wikipedia.org/wiki/String_searching_algorithm –

+1

(假设为x86/64)CMP(比较)指令将设置标志寄存器中的各种标志..然后,您可以使用条件 - 说明,其行为取决于标志。明显的(非效率的)例子是条件跳转:jz(jump-if-zero),jnz(跳转if-not-zero),ja(跳转if-above),jb(跳转if-below),jl (跳 - 如果更少),jg(跳 - 如果 - 更大)等等。还有条件 - 电影。 – ABuckau

回答

2

一种有效的方式做这将是寻找A在B中的第一个字符,使用

 repne scasb 

如果找到匹配的,那么你可以做一个字符串比较A和B使用的当前点。

 repe cmpsb 

我假设你有一个指导,将解释这些指令如何使用寄存器。

有一个更快的方法来搜索字符串中的单个字符,使用具有相同值的循环中的4(或8)个字节的寄存器,但对于此示例程序来说,它过于复杂。

+0

JFYI,在文本中搜索子字符串还有更高效的算法,使用预先计算的表格来预先推出低位文本B,通常是A的全长(每次比较)。但是预先计算需要一些时间(对于B的最大值255也许不值),而且这个任务主要是内存I/O限制,所以通过按A的长度前进的性能增益可能不是那么大(并且再次限制对于A的5可能在阈值之下,8字节的向量化第一个字符检查可能会打败它)。上面检查过维基,我谈论的是“Boyer-Moore”。 – Ped7g