簡體   English   中英

在匯編上寫一個字符串輸入反向

[英]Write a string input reverse on assembley

這是我迄今為止設法做到的

 Data Segment
 str1 db 'String_Reverse','$' 
 strlen1 dw $-str1
 strrev db 20 dup(' ')


 MSG1 DB 10,13,'ENTER ANY STRING :- $'
 MSG2 DB 10,13,'ENTERED STRING IS :- $'
 MSG3 DB 10,13,'REVERSED STRING IS : $'

 MSG4 DB 10,13,'REVERSED STRING IS : $'

 P1 LABEL BYTE
 M1 DB 0FFH
 L2 DB ?
 P11 DB 0FFH DUP ('$')
Data Ends

CUCU MACRO MSG ;MACRO care afiseaza un mesaj dorit
 MOV AH,9
 LEA DX,MSG
 INT 21H
ENDM 

Code Segment
 Assume cs:code, ds:data
 Begin:

 MOV AX,DATA
 MOV DS,AX 

 CUCU MSG1 ;afisare msg1

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

 CUCU MSG2 ; afisare msg2

 CUCU P11 ; afisare string introdus

 CUCU MSG3


 mov ax, data
 mov ds, ax
 mov es, ax
 mov cx, strlen1
 add cx, -2
 lea si, P11
 lea di, strrev
 add si, strlen1
 add si, -2
 L1:
 mov al, [si]
 mov [di], al
 dec si
 inc di
 loop L1
 mov al, [si]
 mov [di], al
 inc di
 mov dl, '$'
 mov [di], dl
 Print:
 mov ah, 09h
 lea dx, strrev
 int 21h
 Exit:
 mov ax, 4c00h
 int 21h
Code Ends
End Begin

目前我有 str1 並且它反向顯示,但我需要反向顯示我從鍵盤獲得的 P11 變量。 從我目前所見,我需要 strlen(P11) 但我不知道如何獲得它。

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

這就是您的數據的來源。 那么為什么不檢查有關它的文檔呢

在調用M1處的內存之前(順便說一句,為什么有兩個標簽,而且都毫無意義?)包含:

FF ?? 24 24 24 24 24 ... FF ?? 24 24 24 24 24 ... (255 個0x24 '$'字節)。

那個?? ,我建議在 int 調用之前將其設置為0 ,因為您沒有提供任何“以前的輸入數據”。 mov byte ptr[dx+1],0 (在lea之后)。

當您輸入字符串“AAAB”時,DOS 將在內存中返回:

FF 04 41 41 41 42 0D 24 24 24 ...

因此,如您所見,您可以讀取L2字節以獲取沒有 CR 的字符串的實際長度,或者您可以在緩沖區中執行strlen函數掃描13

我不確定問題是什么,如果有的話,但你說你不知道,上面應該給你至少兩個如何繼續的想法。

作為旁注,停止使用無意義的標簽,這會讓“閱讀源代碼”變得非常困難,而這正是您大部分時間要做的事情。

此外,當文檔檢查失敗時,您可以嘗試在調試器中對其進行逆向工程。 例如, int 21h調用之后的內存內容有點不言自明(但我仍然更喜歡先檢查文檔)。 然而,您應該能夠在int 21h之后斷點並查看內存。 如果你不是,你做錯了,得到一些調試器+學習如何使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM