英特尔8086字符串反转

时间:2017-05-19 17:21:33

标签: assembly emu8086

我在互联网上找到了这个字符串操作代码,用于反转字符串的内容。任何人都可以解释如何确定字符串的长度,美元在任何类型的字符串程序中表示什么?

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  
End

1 个答案:

答案 0 :(得分:1)

String1 db 'assembly language program', $  
Length dw $-String1-1

你在这个程序中有2个$ -signs,每个都有另一个含义。

  • 第一个$是DOS字符串输出函数09h所需的字符串终止符号。通常,这必须写为...program','$'或仅包含在字符串...program$'的其余部分中。
  • 第二个$是一个特殊的汇编符号,代表当前地址。所以无论汇编程序在哪一行,$都有当前地址。

让我们关注第二种情况。

在行String1 db 'assembly...'中,用户定义的符号 String1 表示字符串在内存中开始的地址。当汇编程序随后处理行Length dw ...时, $ 具有该行的地址,因此也是前一行结尾的地址(两者都相同)。登记/> 由于我们知道字符串的起始位置( String1 )及其结束位置( $ ),因此使用Length dw $-String1进行简单的减法就可以确定长度。
减去额外的1,因为我们不希望字符串终止$字符包含在计数中! Length dw $-String1-1

请注意您在互联网上找到的内容!此程序错误。它错误地包含终止$字符但忘记使用字符串的第一个字符。

下一个代码解决了这个问题:

    MOV  SI, offset String1  
    MOV  CX, Length 
    ADD  SI, CX
Back:
    DEC  SI
    MOV  DL, [SI]
    MOV  AH, 02h
    INT  21h
    LOOP Back