如何在程序集(MASM)中的循环内打印字符串

时间:2015-04-15 16:00:44

标签: string loops assembly masm

所以我对集会很新,而且我的教授在实际解释发生的事情时远没有帮助。

在课堂上,我们设置如下循环:

mov si, 0
mov cx, 5 (repeating the loop 5 times)

L1:
   ...
   loop L1

我们打印这样的字符串:

mov ah, 40h                 ;write to 
mov bx, handle              ;file
mov cx, lmess2              ;number of bytes to write
mov dx, offset mess2        ;
int 21h

所以现在的问题是我需要在循环中打印一个字符串。我看到的问题是CX寄存器用于字符串打印和循环,所以当我尝试运行它时,它会挂起,如预期的那样。

我可以使用不同的寄存器/方法进行循环和字符串打印吗?

也许我可以将SI寄存器的值与我想要的循环的多次迭代进行比较,然后使用JE跳转跳出循环?但对我来说,这似乎有点奇怪。

如果有人能指导我朝着正确的方向前进,我会非常感激。我确信有一个简单的方法可以做到这一点,我可以忽视。

1 个答案:

答案 0 :(得分:4)

两种解决方案:

解决方案#1

mov si, 0
mov bp, 5  ;DON'T USE CX, USE AN UNUSED REGISTER, LIKE BP.

L1:
   ...
   dec  bp      ;BP - 1. Zero-Flag turns on when BP becomes zero.
   jnz  L1      ;IF BP != 0 JUMP L1. JNZ = jump if last result is not zero.

解决方案#2

mov si, 0
mov cx, 5 (repeating the loop 5 times)

L1:
   PUSH CX         ;PRESERVE CX BEFORE IT CHANGES.
   ... ;PRINT HERE.
   POP  CX         ;RESTORE CX FOR PREVIOUS VALUE.
   loop L1

选择的解决方案取决于具体情况:使用寄存器是最快的方法,推送弹出速度较慢(因为堆栈)。如果您有未使用的寄存器,请使用它们,如果您不使用堆栈,速度会更快。