【问题标题】:Write a string input reverse on assembley在汇编上写一个字符串输入反转
【发布时间】:2017-01-18 22:23:15
【问题描述】:

这就是我到目前为止所做的事情

 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) 但我不知道如何获得它。

【问题讨论】:

  • 你知道如何在 C 中编码(没有 stdlib)吗?你能为它写一个算法或流程图吗? PS:评论你的代码(英文),特别是如果你想帮助别人。

标签: assembly input x86 dos


【解决方案1】:
 LEA DX,P1
 MOV AH,0AH 
 INT 21H

这是您的数据的来源。那你为什么不检查documentation about it

M1 调用内存之前(顺便说一句,为什么两个标签,而且都没有意义?)包含:

FF ?? 24 24 24 24 24 ...0x24 '$' 字节中的 255 个字节)。

??,我建议在 int 调用之前将其设置为 0,因为您没有提供任何“以前的输入数据”。 mov byte ptr[dx+1],0(在lea之后)。

当你输入字符串“AAAB”时,DOS会在内存中返回:

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

如您所见,您可以读取L2 字节以获取没有CR 的字符串的实际长度,或者您可以对缓冲区中的13 执行strlen 函数扫描。

我不确定问题是什么,如果有的话,但你说你不知道,上面应该给你至少两个想法如何继续。

作为旁注,停止使用无意义的标签,“阅读源代码”会变得非常困难,而这就是你大部分时间都会做的事情。

此外,当文档检查失败时,您可以尝试在调试器中对其进行逆向工程。例如,int 21h 调用后的内存内容是不言自明的(但我仍然更喜欢先检查文档)。然而,您应该能够在int 21h 之后下断点并查看内存。如果你不是,那你就做错了,并获得一些调试器 + 学习如何使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2021-04-02
    相关资源
    最近更新 更多