我刚刚开始使用汇编,所以这可能是一个非常简单的问题,但我根本无法理解。
我已经创建了一个包含这些值的表:
修改
.data
NUMS WORD 09EEBh, 0B0CFh, 061E5h, 089EDh, 0AF17h, 0D8D1h, 06C1Dh, 0594Eh, 0CF55h
WORD 0AFFFh, 05B8Fh, 06164h, 01CF7h, 09A41h, 0A525h, 0A5A1h, 08F05h, 07E4Ch
WORD 0827Ah, 090B0h, 0722Dh, 0BCCFh, 033ABh, 0DC76h, 085B6h, 0AA5Fh, 03FB3h
WORD 04BACh, 0B822h, 07768h, 0BF1Bh, 05783h, 07EEBh, 09F22h, 0B85Bh, 05312h
WORD 05971h, 0B1B6h, 0B16Dh, 054B3h, 073C8h, 0586Bh, 08170h, 06F16h, 092A0h
WORD 09680h, 0A23Bh, 0B45Dh, 01E91h, 0415Ah, 0B5D9h, 02D02h, 06748h, 03D39h
NUMS_SIZE EQU $ -NUMS
NUMS_LENGTH EQU(NUMS_SIZE / TYPE NUMS)
.code
但是当我运行我的子程序打印出NUMS中的所有值时,它只打印第一行。谁能告诉我为什么不打印整张桌子呢?
这是我打印表格的方式:
printUnsort proc ; print out unsorted table
mov ecx, NUMS_LENGTH
mov edi,0
mov edx, OFFSET s
.WHILE ecx > 0
.IF pcount != 9
mov ax, (NUMS[di])
call WriteHexB
call WriteString
add edi, TYPE NUMS
inc ax
dec ecx
inc pcount
.ELSE
Call CrLf
mov pcount, 0
.ENDIF
.ENDW
ret
printUnsort endp
任何帮助或建议都会非常有帮助。谢谢! =)
答案 0 :(得分:3)
这里的问题是LENGTHOF(以及SIZEOF)假设数组以单数据声明开始和结束。在你的情况下,这是9个单词,不管你有多少45个单词。通常有两种方法可以解决这个问题:
使用单个数据声明(注意使用续行):
NUMS WORD 1, 2, 3, 4, \
5, 6, 7, 8, \
...
但是,您可能会在单行上声明MASM的行长限制。因此,您可以使用此解决方法,将其置于原始NUMS声明之后:
NUMS_SIZE EQU $-NUMS
NUMS_LENGTH EQU (NUMS_SIZE / TYPE NUMS)
使用“NUMS_LENGTH”代替LENGTHOF NUMS。 NUMS_SIZE将是以字节为单位的数组大小(当前位置减去数组开始的位置)。
答案 1 :(得分:2)
虽然我不确定,我猜我LENGTHOF NUMS
只是第一行的长度。请尝试仅使用一个WORD
关键字,将其放在一行或使用逗号或其他内容。我对MASM不太熟悉,不知道你应该怎么做。
答案 2 :(得分:1)
pcount变量的处理真的不清楚,但肯定看错了。我猜它会计算每行写的字数。当它达到9时,你只想要输出一个crlf,然后重置该值回到0.这没有发生,它只会等于9一次。
需要注意的是辅助函数对寄存器变量的作用。我不记得确切的规则,但我认为你只能假设esi和edi的值被保留。你需要推/弹其余部分。
使用调试器。