增加装配中的CX计数器(TASM)

时间:2017-02-05 05:47:32

标签: loops assembly increment tasm

我有这个汇编代码,我过去几天一直在努力。它是我的家庭作业,其条件应打印出从'A'到'J'的字符,但每个字母之间带一个星号 输出:A * B * C * .... J *。

我们应该添加的限制是我们只能使用一个数据容器dl。另外,我们只能使用循环和跳转条件。

我大部分时间都完成了我的工作,但我一直在弄清楚为什么我的计数器cx在我的代码中没有很好地增加。这是我的代码:

.model
.code
org 100h
s: mov ax, 3   ;
   int 10h     ; just clearing the screen
   mov ah, 2
   mov cx, 1   ; counter is just set to one for possible increment
   mov dl, 'A' ; A is added to data container
   int 21h     ; prints out A
x: mov dl, '*' ; first asterisk is then added to container, replacing A
   int 21h     ; asterisk is printed out A*
   mov dl, 'A' ; asterisk is replace by A in the counter
y: inc dl      ;
   loop y      ; loops at y then increments container dl, A + 1-> B
   int 21h     ; prints out container, A*B
   inc cx      ; where the problem lies. Should increment but not
   cmp dl, 'J' ; if the character in container is not above j, jumps to..
   jna x       ; ..where x is
   int 20h     ; ends but doesnt due to infinite looping, container not reaching 'J'
end s

如果增量有效,我认为会发生每次进程跳转到x然后传递给循环y,假设cx已递增,它将循环并递增容器,具体取决于如何计数器cx在多次递增后保持不变。这将导致容器达到超过字母J的条件。

所以这几乎是我的问题。提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:3)

正如你可以通过使用调试器看到的那样增量很好。问题是你有一个loop命令会递减CX直到它为零。因此,递增将始终使CX为1。

CX之前将loop推送到堆栈,如果要保留该值,则将其弹出。并抓住调试器自己调试代码。

或者您只想在DL之前增加CX,为什么不只说ADD DL, CL而不使用循环?