汇编x86倒转句子程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编x86倒转句子程序相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个用户必须输入输入的程序,例如:Hello World并获得输出:'DLROw OLLEh'。这是我的计划

 org 100h
 include emu8086.inc

.DATA
   STR1 DB 0DH, 0AH, 'Input: $'
   STR2 DB 0DH, 0AH, 'Output: $'
   Nl DB 0Dh, 0Ah,'$' 


.CODE
START:
    MOV AX, @DATA
    MOV DS, AX


DISP:
    LEA DX,STR1
    MOV AH,09H
    INT 21H
    MOV CL,00
    MOV AH,01H


READ:
    INT 21H
    MOV BL, AL
    PUSH BX
    INC CX
    CMP AL, 0DH
    JZ DISPLAY
    CMP AL, 'A'                 ; < then A  
    JB  NotALetter
    CMP AL, 'Z'                 ; > then Z 
    JA  AGAIN                   ; repeat again
    JMP CONTINUE1


AGAIN:  
    CMP AL, 'a'                 ; < then a
    JB  NotALetter  
    CMP AL, 'z'                 ; > then z 
    JA  NotALetter       


CONTINUE1:
    JMP READ


DISPLAY:
    LEA DX, STR2
    MOV AH, 09h
    INT 21H
    LEA DX, NL
    MOV AH, 09h
    INT 21h
    POP BX                      ; pop enter key


ANS:
    MOV AH, 02h
    POP BX                      ; pop the character 
    CMP BL, 'a'                 ; check if its in upper case
    JB  toLower                 ; if yes then jmp to toLower 
    SUB BL, 32                  ; if not in upper case then convert to upper case
    JMP CONTINUE2


toLower:
    ADD BL, 32                  ; convert to lower case
    CMP BL, 20h
    ;SUB BL, 32


CONTINUE2:
    MOV DL, BL
    INT 21H
    LOOP ANS  
    JMP EXIT                    ; if everything is fine jmp to exit                 


NotALetter:        
    printn
    print "The input character is not a letter."    


EXIT:
    hlt 


.EXIT
END  START

我可以输入任何输入但是只要我输入任何符号,我收到一条消息,这是一个符号,然后程序结束,而我想获得相同的输出,但仍允许输入空格字符。我在大会上真的很新,而且在我试图解决所有问题时我失去了更多。

如果我评论JB NotALetterJA NotALetter,我的空间角色变成@可能是因为我在ASCII hex数字中加20。有人可以帮忙找出这个问题吗?

答案

只需在toLower方法中添加一个额外的比较,如下所示:

toLower: 
    CMP BL, 'A'
    JL CONTINUE2
    ADD BL, 32                  ; convert to lower case

完整代码:

org 100h
include emu8086.inc


.DATA
  STR1 DB 0DH, 0AH, 'Input: $'
  STR2 DB 0DH, 0AH, 'Output: $'
  Nl DB 0Dh, 0Ah,'$' 


.CODE
START:
    MOV AX, @DATA
    MOV DS, AX


DISP:
    LEA DX,STR1
    MOV AH,09H
    INT 21H
    MOV CL,00
    MOV AH,01H


READ:
    INT 21H
    MOV BL, AL
    PUSH BX
    INC CX
    CMP AL, 0DH
    JZ DISPLAY
    CMP AL, 'A'                 ; < then A  
    JB  CONTINUE1
    CMP AL, 'Z'                 ; > then Z 
    JA  AGAIN                   ; repeat again
    JMP CONTINUE1


AGAIN:  
    CMP AL, 'a'                 ; < then a
    JB  CONTINUE1  
    CMP AL, 'z'                 ; > then z 
    JA  CONTINUE1       


CONTINUE1:
    JMP READ


DISPLAY:
    LEA DX, STR2
    MOV AH, 09h
    INT 21H
    LEA DX, NL
    MOV AH, 09h
    INT 21h
    POP BX                      ; pop enter key


ANS:
    MOV AH, 02h
    POP BX                      ; pop the character 
    CMP BL, 'a'                 ; check if its in upper case
    JB  toLower                 ; if yes then jmp to toLower 
    SUB BL, 32                  ; if not in upper case then convert to upper case
    JMP CONTINUE2


toLower: 
    CMP BL, 'A'
    JL CONTINUE2
    ADD BL, 32                  ; convert to lower case


CONTINUE2:
    MOV DL, BL
    INT 21H
    LOOP ANS  
    JMP EXIT                    ; if everything is fine jmp to exit                 


;NotALetter:       
;    printn
;    print "The input character is not a letter."    


EXIT:
    hlt 


.EXIT
END  START

输入Hello World,输出DLROw OLLEh

另外,你真的不需要NotALetter方法,你可以注意到,我只是注释掉了。

另一答案

我可以输入任何输入但是只要我输入任何符号,我收到一条消息,这是一个符号,然后程序结束,而我想获得相同的输出,但仍允许输入空格字符。

因为OP希望捕获空间而不会弄乱符号消息。这可以通过以下方式实现:

在比较输入键后的READ标签中添加以下内容:

CMP AL, ' '                  ; compare for space  
JZ CONTINUE1

弹出bx后在ANS标签中添加:

CMP BL, ' '                 ; if equal to space
JZ  CONTINUE2               ; then print it by going to CONTINUE2 label

以上是关于汇编x86倒转句子程序的主要内容,如果未能解决你的问题,请参考以下文章

X86汇编6.编写汇编语言程序

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

反汇编基本原理与x86指令构造

如何反汇编原始 16 位 x86 机器代码?

如何在汇编程序 x86 函数调用中传递参数?

《现代x86汇编语言程序设计》怎么写里边的代码