اضافه کردن یک رشته به درون رشته دیگر در زبان اسمبلی

the_king

مدیرکل انجمن
گاهی اوقات نیاز به کدی داریم که یک رشته را با رشته دیگری ادغام کند، اما همیشه درج این رشته جدید در
انتهای رشته قبلی نیست، کد زیر نشان می دهد که چگونه می توانیم یک رشته را در موقعیت n ام رشته دیگری
اضافه کنیم، مقدار n از 1 شروع می شود. اگر مقدار n برابر 1 باشد، رشته جدید دقیقا در ابتدای رشته قبلی
اضافه می شود و پیش از آن قرار می گیرد.

کد:
.MODEL      SMALL
.DATA
    msg1    DB "Please enter first string :",13,10,"$"
    msg2    DB 13,10,"Please enter second string :",13,10,"$"
    msg3    DB 13,10,"Please enter number n (n>0) :",13,10,"$"
    msg4    DB 13,10,"First string after insert :",13,10,"$"
    msg5    DB 13,10,"Press any key to continue.",13,10,"$"
    string1 DB 80
            DB ?
            DB 80 DUP (?)
    extra   DB 80 DUP (?)
    string2 DB 80
            DB ?
            DB 80 DUP (?)
    number  DB 3
            DB ?
            DB 3 DUP (?)
.CODE
.STARTUP
    MOV     AH, 9
    LEA     DX, msg1
    INT     21h
loop_1:
    MOV     AH, 0ah
    LEA     DX, string1
    INT     21h
    CMP     string1[1], 0
    JZ      loop_1
    MOV     AH, 9
    LEA     DX, msg2
    INT     21h
loop_2:
    MOV     AH, 0ah
    LEA     DX, string2
    INT     21h
    CMP     string2[1], 0
    JZ      loop_2
    MOV     AH, 9
    LEA     DX, msg3
    INT     21h
loop_3:
    MOV     AH, 0ah
    LEA     DX, number
    INT     21h
    MOV     CL, number[1]
    CMP     CL, 0
    JZ      loop_3
    MOV     CH, 0
    LEA     SI, number[2]
    MOV     DI, 10
    MOV     BX, 0
loop_4:
    MOV     AL, [SI]
    CMP     AL, "0"
    JB      next_1
    CMP     AL, "9"
    JA      next_1
    SUB     AL, "0"
    MOV     AH, 0
    XCHG    AX, BX
    MUL     DI
    ADD     BX, AX
next_1:
    INC     SI
    LOOP    loop_4
    CMP     BX, 0
    JZ      loop_3
    MOV     CL, string1[1]
    MOV     CH, 0
    DEC     BX
    CMP     BX, CX
    JBE     next_2
    MOV     BX, CX
next_2:
    LEA     SI, string1[2]
    ADD     SI, CX
    MOV     AX, BX
    MOV     BL, string2[1]
    MOV     BH, 0
    MOV     BYTE PTR [SI+BX], "$"
    SUB     CX, AX
    JZ      next_3
loop_5:
    DEC     SI
    MOV     AL, [SI]
    MOV     [SI+BX], AL
    LOOP    loop_5
next_3:
    MOV     CX, BX
    LEA     DI, string2[2]
loop_6:
    MOV     AL, [DI]
    MOV     [SI], AL
    INC     SI
    INC     DI
    LOOP    loop_6
    MOV     AH, 9
    LEA     DX, msg4
    INT     21h
    LEA     DX, string1[2]
    INT     21h
    LEA     DX, msg5
    INT     21h
    MOV     AH, 8
    INT     21h
.EXIT
.STACK
END
 

the_king

مدیرکل انجمن
جانشینی یک رشته روی رشته دیگر در زبان اسمبلی

در کد قبلی ما رشته جدید را به رشته قبلی اضافه کردیم مثلا اگر رشته "one" در موقعیت 1 رشته "book"
درج می شد، رشته "onebook" بدست می آمد.

اما گاهی اوقات نیاز به کدی داریم که یک رشته روی یک رشته دیگری جانشین شود،
یعنی بر خلاف کد قبلی، کاراکتر هایی که زیر رشته جدید قرار می گیرند حذف گردند.
مثلا اگر رشته "one" در موقعیت 1 رشته "book" جانشین شود، رشته "onek" حاصل گردد.

کد زیر نشان می دهد که چگونه می توانیم یک رشته را در موقعیت n ام رشته دیگری جایگزین کنیم،
مقدار n از 1 شروع می شود.

کد:
.MODEL      SMALL
.DATA
    msg1    DB "Please enter first string :",13,10,"$"
    msg2    DB 13,10,"Please enter second string :",13,10,"$"
    msg3    DB 13,10,"Please enter number n (n>0) :",13,10,"$"
    msg4    DB 13,10,"First string after overwrite :",13,10,"$"
    msg5    DB 13,10,"Press any key to continue.",13,10,"$"
    string1 DB 80
            DB ?
            DB 80 DUP (?)
    extra   DB 80 DUP (?)
    string2 DB 80
            DB ?
            DB 80 DUP (?)
    number  DB 3
            DB ?
            DB 3 DUP (?)
.CODE
.STARTUP
    MOV     AH, 9
    LEA     DX, msg1
    INT     21h
loop_1:
    MOV     AH, 0ah
    LEA     DX, string1
    INT     21h
    CMP     string1[1], 0
    JZ      loop_1
    MOV     AH, 9
    LEA     DX, msg2
    INT     21h
loop_2:
    MOV     AH, 0ah
    LEA     DX, string2
    INT     21h
    CMP     string2[1], 0
    JZ      loop_2
    MOV     AH, 9
    LEA     DX, msg3
    INT     21h
loop_3:
    MOV     AH, 0ah
    LEA     DX, number
    INT     21h
    MOV     CL, number[1]
    CMP     CL, 0
    JZ      loop_3
    MOV     CH, 0
    LEA     SI, number[2]
    MOV     DI, 10
    MOV     BX, 0
loop_4:
    MOV     AL, [SI]
    CMP     AL, "0"
    JB      next_1
    CMP     AL, "9"
    JA      next_1
    SUB     AL, "0"
    MOV     AH, 0
    XCHG    AX, BX
    MUL     DI
    ADD     BX, AX
next_1:
    INC     SI
    LOOP    loop_4
    CMP     BX, 0
    JZ      loop_3
    DEC     BX
    MOV     AL, string1[1]
    MOV     AH, 0
    CMP     BX, AX
    JBE     next_2
    MOV     BX, AX
next_2:
    LEA     SI, string1[2]
    MOV     DI, SI
    ADD     DI, BX
    MOV     CL, string2[1]
    MOV     CH, 0    
    ADD     BX, CX
    CMP     BX, AX
    JA      next_3
    ADD     SI, AX
    JMP     next_4
next_3:
    ADD     SI, BX
    INC     SI
next_4:
    MOV     BYTE PTR [SI], "$"
    LEA     SI, string2[2]
loop_5:
    MOV     AL, [SI]
    MOV     [DI], AL
    INC     SI
    INC     DI
    LOOP    loop_5
    MOV     AH, 9
    LEA     DX, msg4
    INT     21h
    LEA     DX, string1[2]
    INT     21h
    LEA     DX, msg5
    INT     21h
    MOV     AH, 8
    INT     21h
.EXIT
.STACK
END
 

جدیدترین ارسال ها

بالا