【发布时间】:2022-01-03 02:41:53
【问题描述】:
我被分配了以下任务:
给定两个具有 16 个元素的数组:NIZA RESW 16 和 NIZB RESW 16
在第三个数组 (NIZC RESW 16) 中存储以下值:NIZC[i]=NIZA[i]+NIZB[i] 使用 MMX 指令并使用 NASM 编译它
这是我目前得到的:
%include "apicall.inc"
%include "print.inc"
segment .data
unos1 db "Array A: ", 0
unos2 db "Array B: ", 0
ispisC db "Array C : ", 0
segment .bss
NIZA RESW 16
NIZB RESW 16
NIZC RESW 16
segment .text
global start
start:
call init_console
mov esi,0
mov ecx, 16
mov eax, unos1
call print_string
call print_nl
unos_a:
call read_int
mov [NIZA+esi], eax
add esi, 2
loop unos_a
mov esi,0
mov ecx, 16
mov eax, unos2
call print_string
call print_nl
unos_b:
call read_int
mov [NIZB+esi], eax
add esi, 2
loop unos_b
movq mm0, qword [NIZA]
movq mm1, qword [NIZB]
paddq mm0, mm1
movq qword [NIZC], mm0
mov esi,NIZC
mov ecx,16
mov eax, ispisC
call print_string
call print_nl
ispis_c:
mov ax, [esi]
movsx eax, ax
call print_int
call print_nl
add esi, 2
loop ispis_c
APICALL ExitProcess, 0
编译给定数组后,用下面两个数组进行测试,第三个数组只存储了16个元素中的4个。(如下图所示)
有人知道为什么它只存储 16 个元素中的 4 个吗?任何帮助表示赞赏。
如果您对函数 print_string print_int print_nl 有任何疑问,这些函数用于通过将字符串压入 EAX 寄存器来打印出字符串、换行符和整数,还要注意这是一个 32 位程序。
【问题讨论】:
-
MMX,嗯? 90 年代后期打来电话,他们有一些 Pets.com 股票要卖给你。如今,SSE 及其继任者几乎普遍可用。
-
我只看到
NIZC的一个存储,而且它似乎不在循环内,因此您只存储 4 个元素(64 位)似乎很自然。跨度> -
另外,
mov [NIZA+esi], eax似乎正在对应该是 16 位值的内容进行 32 位存储。我在你的循环中看到了对print_string、print_nl等的调用;你确定他们保留了 ecx、esi 和任何其他相关的寄存器吗?最后,theloopinstruction is a habit you don't want to develop。 -
使用调试器单步执行可能对理解代码做什么和不做什么很有帮助。你知道怎么做吗?如果没有,现在是学习的时候了。
-
关于
print_string和print_nl保留寄存器,你可以在这里看到代码,pastebin.com/ZtTn6RU7,我尝试只使用 mov 和递增来对两个数组求和,并且效果很好跨度>
标签: arrays assembly x86 nasm mmx