可能是一个愚蠢的问题,但这是我的机器组织课程中的第一个项目,我遇到了一些麻烦。下面的代码旨在从上到下在屏幕中间显示“*”。
不会组装的代码行是:
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
答案 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 '*'
通常,您应尽量减少细分的使用。由于现代计算机具有大量内存,因此大多数汇编语言现在使用“扁平”模型,除了专门用途之外,不使用段。