1

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

我理解为什么这不会组装,但是我不知道要代替什么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 
4

2 回答 2

1

不要尝试修改常量内存(就像原来的问题一样)。

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

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

作为一项规则,您应该尽量减少段的使用。由于现代计算机具有大量内存,大多数汇编语言现在使用“平面”模型,其中除了特殊目的之外不使用段。

于 2015-02-26T18:34:30.733 回答
1

使用寄存器计算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),但如果您只想要一些有效的东西,这应该就足够了。

于 2015-02-26T17:56:55.807 回答