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

Posted

技术标签:

【中文标题】如何在程序集的循环内打印字符串(MASM)【英文标题】:How to print a string inside of a loop in assembly (MASM) 【发布时间】:2015-04-15 16:00:44 【问题描述】:

所以我是组装新手,我的教授在实际解释正在发生的事情时几乎没有帮助。

在课堂上,我们这样设置循环:

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 跳转跳出循环?但对我来说,这似乎有点奇怪。

如果有人能指引我正确的方向,我将不胜感激。我确信有一种简单的方法可以做到这一点,但我忽略了这一点。

【问题讨论】:

简单的方法是在打印前push cx,在打印后pop 我对解决方案 #1 做了一些小改动。当 BP 递减并变为零时,零标志打开。 JNZ = 如果不为零则跳转,因此,只要零标志关闭(BP 尚未为零),循环就会重复,并在零标志打开(BP 为零)时结束。 【参考方案1】:

两种解决方案:

解决方案 #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

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

【讨论】:

以上是关于如何在程序集的循环内打印字符串(MASM)的主要内容,如果未能解决你的问题,请参考以下文章

在 MASM 程序集中逐字节循环和处理字符串

汇编程序 MASM,当值为 0 或以下时在 JNZ 循环中打印

如何让 fgetc 在循环内打印文件的所有字符

在汇编 (MASM) 中显示字符串的偶数字符

MASM 8086 在文本前出现乱码

在 Assembly x86 MASM 中连接字符串和数组的大小