在汇编语言中获取变量的值

Obtaining a variable's value in Assembly Language

可能是个愚蠢的问题,但这是我在机器组织中的第一个项目 class,我遇到了一些麻烦。下面的代码是为了在屏幕中间从上到下显示'*'。 不会 assemble 的代码行是:
MOV ES: [ numLoops * 80 * 2 + (40 * 2) ], BYTE PTR '*'

我明白为什么这不会 assemble,但我不知道用什么代替 numLoops 来获取它的值,以便每次执行该行代码时随着 numLoops 递减,它会向上移动一行。任何建议将不胜感激,谢谢。

MyData SEGMENT

    numLoops DB 25

MyData ENDS     

;-------------------------------------------------------------------------------
MyCode SEGMENT

        ASSUME CS:MyCode, DS:MyData   

MainProg  PROC                

    MOV     AX, MyData             
    MOV     DS, AX                 
    MOV     AX, 0B800h         
    MOV     ES, AX

    loop25: 

      CALL displayChar

      DEC numLoops                  
      CMP numLoops, 0
    JNE loop25                ;if not equal to 0, numLoops - 1 and repeat

    MOV     AH, 4Ch                
    INT     21h                   

MainProg ENDP  

displayChar  PROC 

    MOV     ES: [ numLoops * 80 * 2 + (40 * 2)  ], BYTE PTR '*' 

    RET
displayChar ENDP                 

MyCode ENDS 

使用寄存器计算numLoops * 80 * 2:

  mov bx,[numLoops]
  imul bx,bx,160
  mov byte ptr es:[bx + 40*2],'*'  ; note that byte ptr goes before the memory
                                   ; operand, not the immediate operand.

有更有效的方法来做到这一点(例如,从寄存器中的 25*160 开始,每次迭代期间只从中减去 160),但如果你只是想要一些有用的东西,这就足够了。

不要尝试修改常量内存(就像在原始问题中那样)。

循环次数应该保存在寄存器中,而不是常量数据中。所以你应该有这样的东西:

MOV CX, 25     ; number of times to loop
[do math on CX and put in DX]
MOV ES:DX, BYTE PTR '*'

通常,您应该尽量减少段的使用。由于现代计算机具有大量内存,大多数汇编语言现在使用 "flat" 模型,其中除了专门用途外不使用段。