【问题标题】:Intel 8086 string reversalIntel 8086 字符串反转
【发布时间】:2017-05-19 17:21:33
【问题描述】:

我在互联网上找到了这个字符串操作代码,用于反转字符串的内容。谁能解释一下字符串的长度是如何确定的,美元在任何类型的字符串程序中意味着什么?

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

【问题讨论】:

  • 更好的问题是“$db 'assembly language program', $ 中的用途是什么?”那让我感到困惑...... C sriings 是空终止的,Pascal 保持开始时的长度。谁在末尾添加带有长度(?)的字节?
  • 汇编语言语法是由汇编器(不是目标)定义的,所以这不是一个 8086 问题,而是我有一些汇编器(一个像 masm、nasm、gas 这样的程序),这是什么语法意思。你用的是什么软件?
  • @Arkadiy 看看stanislavs.org/helppc/int_21-9.html 看起来有人混合了$ 符号的不同用法
  • @Lashane,抱歉,没有看到答案... $ 似乎是一个字面美元符号。

标签: assembly emu8086


【解决方案1】:
String1 db 'assembly language program', $  
Length dw $-String1-1

你在这个程序中有 2 个 $ 符号,每个符号都有不同的含义。

  • 第一个 $ 是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多