如何在汇编 (MASM) 中的循环内打印字符串
How to print a string inside of a loop in assembly (MASM)
所以我是汇编的新手,我的教授在实际解释正在发生的事情时一点帮助也没有。
在class中,我们这样设置循环:
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 寄存器同时用于字符串打印和循环,所以当我尝试 运行 它时,它按预期挂起。
是否有不同的 register/method 我可以用于循环和字符串打印?
也许我可以将SI寄存器的值与我想要的循环迭代次数进行比较,然后使用JE跳转跳出循环?但对我来说,这似乎有点奇怪。
如果有人能指导我正确的方向,我将不胜感激。我确定有一种简单的方法可以做到这一点,但我忽略了。
两种解决方案:
解决方案#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
选择的解决方案取决于情况:使用寄存器是最快的方法,推入弹出较慢(因为堆栈)。如果你有未使用的寄存器,使用它们,它更快,如果你没有,使用堆栈。
所以我是汇编的新手,我的教授在实际解释正在发生的事情时一点帮助也没有。
在class中,我们这样设置循环:
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 寄存器同时用于字符串打印和循环,所以当我尝试 运行 它时,它按预期挂起。
是否有不同的 register/method 我可以用于循环和字符串打印?
也许我可以将SI寄存器的值与我想要的循环迭代次数进行比较,然后使用JE跳转跳出循环?但对我来说,这似乎有点奇怪。
如果有人能指导我正确的方向,我将不胜感激。我确定有一种简单的方法可以做到这一点,但我忽略了。
两种解决方案:
解决方案#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
选择的解决方案取决于情况:使用寄存器是最快的方法,推入弹出较慢(因为堆栈)。如果你有未使用的寄存器,使用它们,它更快,如果你没有,使用堆栈。