【问题标题】:Read and print string - Assembly读取和打印字符串 - 汇编
【发布时间】:2014-04-06 13:53:28
【问题描述】:

我正在尝试在汇编中创建一个程序,该程序可以逐个字符地读取,将其存储在数组中,然后逐个字符地打印。我知道我可以使用中断来读取和打印字符串,但想要一个自己的代码来了解更多信息。

代码被读取,但不知道为什么不打印:

buff dw 0,0,0,0,0,0 
len equ 5 

mov ah, 1 
mov si, 0 

read: 
        
     mov al b.buff[si] 
     int 21h 
     inc si 
     cmp si, len 
     jl read 
     jmp print 
    
mov si, 0 
mov ah, 2 
   
print: 

     mov dl, b.buff [si] 
     int 21h 
     inc si
     cmp dl, 0 
     je end 
     jmp print
    
end:

【问题讨论】:

  • 问题/问题是?
  • 这是完整的程序吗?它看起来不像会组装(我可以看到至少一个缺少的逗号),即使是这样,我也怀疑它是否会正常运行,因为您已将数据放入代码路径中。此外,您的读取循环永远不会将任何内容存储到 buff

标签: string assembly x86 dos


【解决方案1】:

你做错了很多。不要难过 - 没有人天生就知道这些东西。

1) 你没有告诉我们你使用的是什么汇编程序。他们不一样! (看起来可能是 Eric Isaacson 的 a86?)

2) 您的缓冲区被声明为“字”,但您将其用作“字节”。这可能不会造成太大的伤害。

3) 您的缓冲区可能应该位于“数据”部分。您将尝试执行缓冲区。这可能会把你弄得一团糟。

4) 在您的“读取”循环中,您将缓冲区中的一个零放入al,然后读取一个字符(放入al)并且不要对它做任何事情!这是您的两个“大”问题之一。

5) 在“读取”循环结束时,您跳过将 si 重置为零的两行并将 2 加载到 ah... 所以您仍在“读取”,而不是打印 (并在缓冲区中的意外位置)。这是另一个“大”问题。

6) 您的“打印”循环需要一个以零结尾的字符串。在“读取”循环结束时,您没有明确地零终止您的字符串。由于您的缓冲区已预先填充零,因此这可能不会有什么坏处,但您可能想要这样做。

7) 你不会干净地退出到 DOS (int 21h/4Ch)...除非“结束”这样做(取决于汇编程序?)。

可能还有更多,但这应该会让你更接近。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多