首页 > 解决方案 > 在 8086 模拟器中取字符串长度和反向

问题描述

谁能帮我扭转这个字符串?

这是我的代码

include 'emu8086.inc'    

 PRINTN 'Enter length of string'
 mov ah,1h
 int 21h

 printn                 
 
 print "Enter String here: "
 mov cl,al
 sub cl,'0'         
 mov dl,cl           
 mov bx,0
 
 
 p1:  
 
 mov ah,1h
 int 21h             
 
 mov [bx],ax        
 inc bx             
 dec cl
 cmp cl,0           
 jne p1       
 
 
 printn
 PRINT 'inputted string : '
 
 mov cl,dl
 mov bx,0

 output:
 mov dl,[bx]
 
 mov ah,2h
 int 21h    
 
 inc bx   
 dec cl
 cmp cl,0  
 jne output
 printn     
 
 mov ax, 4c00h  
 int 21h

ret

标签: stringassemblyreversex86-16emu8086

解决方案


  • 您将字符串存储在地址 0 ( mov bx, 0)。根据您创建的程序类型,这可能会覆盖重要数据。在下面的示例程序中,我选择了 .COM 格式,您不必担心设置段寄存器。他们都是平等的。
  • 存储字符串字符 ( mov [bx],ax) 时,应使用AL. 该字符仅在AL寄存器中。
  • 在序列dec cl cmp cl,0 jne p1中,cmp cl, 0是多余的,因为dec cl指令已经提供了测试为零标志 ZF。并且知道这是一个带有 DOS 系统调用的输入循环,所以无论如何它很慢,你可以使用loop p1.
  • 消息“输入的字符串:”并不能真正反映您所做的事情,是吗?也许写一些类似'反转字符串:'的东西?
  • 就像@Peter Cordes 在评论中告诉你的那样,在p1输入循环结束时,BX寄存器指向字符串的最后一个字符。重复使用它,但以预先递减的方式进行。这与您在输入循环中使用的后递增方式相反。
  • 输出循环也可以使用较小的loop p2指令,因为速度方面的瓶颈是 DOS 系统调用,无论如何它都很慢。
#make_COM#
include 'emu8086.inc'
ORG 100h

  PRINTN 'Enter length of string'
  mov  ah, 01h
  int  21h                  ; -> AL = "0" to "9"
  sub  al, '0'
  mov  dl, al
  mov  dh, 0                ; -> DX = 0 to 9
  printn

  print "Enter String here: "
  mov  bx, OFFSET Buffer
  mov  cx, dx
p1:  
  mov  ah, 01h
  int  21h
  mov  [bx], al
  inc  bx                   ; "post-increment"
  loop p1
  printn

  PRINT 'reversed string : '
  mov  cx, dx
p2:
  dec  bx                   ; "pre-decrement"
  mov  dl, [bx]
  mov  ah, 02h
  int  21h    
  loop p2
  printn

  mov ax, 4C00h
  int 21h

Buffer db 10 dup(0)

推荐阅读