2016-05-17 6 views
0

Ich bin wirklich ein Anfänger in der Assemblersprache. Ich habe sehr wenig Kenntnis von der Syntax. Ich habe es im Internet studiert, aber ich kann es nicht gut verstehen. Ich habe ein Beispielproblem zum Experimentieren gefunden, kann aber nicht wirklich verstehen, wie es geht.Größer, weniger als oder gleich in der Assemblersprache?

hier ist das Problem

Sie zwei Zeichenketten angegeben werden, die wir als A beziehen und B. A ist höchstens 5 Zeichen lang sein und B höchstens 255 Zeichen lang sein. Schreiben Sie ein Assemblerprogramm, das die Anzahl der Vorkommen der Zeichenkette A in der Zeichenkette B zählt, wobei das Ergebnis AL bleibt. Wenn also A die Zeichenfolge "job" und B die Zeichenfolge "job I get a job" ist, sollte Ihr Programm 2 in AL belassen.

bisher kann ich nur ausdrucken und strings anzeigen. Wie löse ich das Problem, das mathematische Logik beinhaltet?

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

Edit:

Ich habe einen Beispielcode, sondern nur für Zeichen. Wie ersetze ich es zu Zeichenkette?

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

Klingt, als ob Sie versuchen, eine String-Suche in Assembly zu programmieren. Es gibt viele Möglichkeiten, dies zu tun. Schlagen Sie vor, dass Sie mit der naiven String-Suche beginnen https://en.wikipedia.org/wiki/String_searching_algorithm –

+1

(vorausgesetzt, x86/64) Eine CMP-Anweisung (compare) setzt verschiedene Flags im Flags-Register .. Sie können dann bedingte- Anweisungen, deren Verhalten von den Flags abhängt. Offensichtliche (nicht effiziente) Beispiele sind die bedingten Sprünge: jz (Sprung-wenn-Null), jnz (Sprung-wenn-nicht-Null), ja (Sprung-wenn-oben), jb (Sprung-wenn-unten), jl (jump-wenn-weniger), jg (jump-wenn-größer) usw. Es gibt auch Conditional-MOVes. – ABuckau

Antwort

2

Ein effizienter Weg, dies zu tun in B für das erste Zeichen von A zu suchen wäre, mit

 repne scasb 

, wenn Sie ein Spiel finden, dann können Sie eine Zeichenfolge tun von A vergleichen und der aktuelle Spot in B mit.

Ich nehme an, Sie haben eine Anleitung, die erklärt, wie die Register von diesen Anweisungen verwendet werden.

Es gibt eine etwas schnellere Methode, nach einem einzelnen Zeichen in einem String zu suchen, indem ein Register mit 4 (oder 8) Bytes mit dem gleichen Wert in einer Schleife verwendet wird, aber für dieses Beispielprogramm ist es zu kompliziert.

+0

JFYI, es gibt noch effizientere Algorithmen zum Suchen von Teilstrings im Text, wobei eine vorberechnete Tabelle verwendet wird, um durch Text B oft um die volle Länge von A voranzuschreiten (pro Vergleich). Aber die Vorberechnung dauert einige Zeit (vielleicht nicht wert für max 255 von B), und auch diese Aufgabe ist hauptsächlich Speicher-I/O-begrenzt, so dass der Leistungsgewinn durch das Vorrücken um die Länge von A wahrscheinlich nicht so groß ist (und wieder Limit von 5 für A ist wahrscheinlich unter dem Schwellenwert, wo es sinnvoll ist, die 8 Bytes vektorisierten ersten Char-Check wird wahrscheinlich schlagen, dass). Habe das obige Wiki überprüft, von dem ich spreche ist "Boyer-Moore". – Ped7g