在汇编中写一个字符串输入反向
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
这是您的数据来源。那你为什么不检查 documentation about it?
在 M1
处调用内存之前(顺便说一句,为什么有两个标签,而且都没有意义?)包含:
FF ?? 24 24 24 24 24 ...
(0x24 '$'
字节中的 255 个)。
那个 ??
,我建议在 int 调用之前将它设置为 0
,因为您没有提供任何 "previous input data"。 mov byte ptr[dx+1],0
(在 lea
之后)。
当你输入字符串"AAAB",那么DOS会在内存中return这个:
FF 04 41 41 41 42 0D 24 24 24 ...
因此如您所见,您可以读取 L2
字节以获取字符串的实际长度而无需 CR,或者您可以对缓冲区中的 13
执行 strlen
函数扫描。
我不确定问题是什么,如果有的话,但你说你不知道,以上应该至少给你两个想法如何继续。
附带说明一下,停止使用无意义的标签,这会使 "read the source" 变得非常困难,而这正是您大部分时间会做的事情。
另外,当文档检查失败时,您可以尝试在调试器中对其进行逆向工程。例如, int 21h
调用后的内存内容有点不言自明(但我仍然更喜欢先查看文档)。然而,您应该能够在 int 21h
之后设置断点并查看内存。如果不是,那你就做错了,找一些调试器+学习如何使用它。
这是我到目前为止所做的
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
这是您的数据来源。那你为什么不检查 documentation about it?
在 M1
处调用内存之前(顺便说一句,为什么有两个标签,而且都没有意义?)包含:
FF ?? 24 24 24 24 24 ...
(0x24 '$'
字节中的 255 个)。
那个 ??
,我建议在 int 调用之前将它设置为 0
,因为您没有提供任何 "previous input data"。 mov byte ptr[dx+1],0
(在 lea
之后)。
当你输入字符串"AAAB",那么DOS会在内存中return这个:
FF 04 41 41 41 42 0D 24 24 24 ...
因此如您所见,您可以读取 L2
字节以获取字符串的实际长度而无需 CR,或者您可以对缓冲区中的 13
执行 strlen
函数扫描。
我不确定问题是什么,如果有的话,但你说你不知道,以上应该至少给你两个想法如何继续。
附带说明一下,停止使用无意义的标签,这会使 "read the source" 变得非常困难,而这正是您大部分时间会做的事情。
另外,当文档检查失败时,您可以尝试在调试器中对其进行逆向工程。例如, int 21h
调用后的内存内容有点不言自明(但我仍然更喜欢先查看文档)。然而,您应该能够在 int 21h
之后设置断点并查看内存。如果不是,那你就做错了,找一些调试器+学习如何使用它。