在汇编语言中获取变量的值
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" 模型,其中除了专门用途外不使用段。
可能是个愚蠢的问题,但这是我在机器组织中的第一个项目 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" 模型,其中除了专门用途外不使用段。