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

时间:2015-02-26 17:17:11

标签: assembly dosbox

可能是一个愚蠢的问题,但这是我的机器组织课程中的第一个项目,我遇到了一些麻烦。下面的代码旨在从上到下在屏幕中间显示“*”。 不会组装的代码行是:
 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 

2 个答案:

答案 0 :(得分: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),但如果您只想要有效的话,这应该足够了。

答案 1 :(得分:1)

不要尝试修改常量内存(如原始问题中所述)。

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

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

通常,您应尽量减少细分的使用。由于现代计算机具有大量内存,因此大多数汇编语言现在使用“扁平”模型,除了专门用途之外,不使用段。