在8086中反转字符串时出错

时间:2014-01-06 12:04:48

标签: assembly x86-16

我有这个代码使用8086 ALP来反转字符串。但是代码无法正常工作并进入无限循环或打印一些随机字符。

.model small
.stack 100h
.data
String1 DB "Assembly Language Program$"
Length dw $-String1-1

.code
Main proc
MOV AX, @data
MOV DS, AX

MOV SI, Offset String1
MOV CX, Length  
ADD SI, CX

Back: MOV DL, [SI]
MOV AH, 02H
INT 21H
DEC SI
LOOP Back  

MOV AH, 4CH
INT 21H
Main endp
End main

2 个答案:

答案 0 :(得分:1)

您的代码有两个问题:

  1. $代表"当前编译指令"的偏移量,它可用于某些偏移算术,但是您声明length的方式数据没有按照你的想法进行。实际上,length包含自身的偏移量减去String1的偏移量减去1.使用$计算长度的常用方法是使用equ字符串声明后的常量,如:

    String1 DB "Assembly Language Program$"
    Length EQU $-String1 
    

    也就是说,MOV CX, Length将使用字符串的长度加载CX而不是内存偏移量。 EQU在结果程序中不占任何位置。无论如何你想在内存中有一个字符串长度的位置,而不仅仅是在汇编时定义它,你可以做

    String1 DB "Assembly Language Program$"
    strl EQU $-String1 
    Length DW strl    ;the initialized data will be the string length, not an offset
    
  2. 您的代码开始将字符串1字节反转得太长,对于1字节字符串,您不必添加任何内容,因此例如DEC SI将更正偏移量。

  3. 以下(略微)修改的程序可以执行您想要的操作:

    .model small
    .stack 100h
    .data
    String1 DB "Assembly Language Program$"
    Length equ $-String1-1
    
    .code
    Main proc  
    MOV AX, @data
    MOV DS, AX
    
    MOV SI, Offset String1
    MOV CX, Length  
    ADD SI, CX
    DEC SI
    
    Back: MOV DL, [SI]
    MOV AH, 02H
    INT 21H
    DEC SI
    LOOP Back  
    
    MOV AH, 4CH
    INT 21H
    Main endp
    End main
    

答案 1 :(得分:0)

我认为问题是

ADD SI, CX

而你 必须

MOV SI, CX

我想说我不熟悉这种实施方式,我无能为力。但是看看这个代码也是反向字符串。

TITLE reverse
ASSUME CS:CODE, DS:data
CODE SEGMENT


START:
    MOV AX,data
    MOV DS,AX

    MOV SI,0 ; pointer
LENGTH:
    CMP message[SI],'$'
    JE NEXT

    INC SI
    JMP LENGTH
NEXT:
    MOV CX,SI
    DEC SI
CHANGE:
    MOV DL,message[SI]

    MOV AH,02H  
    INT 21H     

    DEC SI
    LOOP CHANGE
END:
    MOV AH,4CH 
        int 21h 


CODE ENDS

DATA SEGMENT 

    MSG DB 10,13,"$"
    message DB 'Assembly Language Program$'

DATA ENDS

END START