我有这个代码使用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
答案 0 :(得分: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
您的代码开始将字符串1字节反转得太长,对于1字节字符串,您不必添加任何内容,因此例如DEC SI
将更正偏移量。
以下(略微)修改的程序可以执行您想要的操作:
.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