我被賦予了以下任務:
給定兩個包含 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 位程式。
uj5u.com熱心網友回復:
有人知道為什么它只存盤 16 個元素中的 4 個嗎?
因為你讓你的 MMX 指令只對前 4 個陣列元素進行操作。您需要一個回圈來處理所有 16 個陣列元素。
您的任務描述沒有說明,但我看到您在列印之前對來自NIZC的值進行了符號擴展,因此您似乎期待簽名結果。我還看到您用于PADDQ對 4 個字大小的輸入進行操作。這將不會總是給出正確的結果!例如。如果NIZA[0]=-1和NIZB[0]=5,那么你會得到,NIZC[0]=4但是從第一個詞到第二個詞會發生進位,留下NIZC[1]錯誤。如果您使用正確版本的打包添加,則不會發生這種情況:PADDW。
您很幸運,因為mov [NIZA esi], eax和上的尺寸錯誤mov [NIZB esi], eax。因為NIZA和NIZB按照您分配給它們的相同順序在記憶體中相互跟隨,所以沒有造成任何傷害。如果NIZB應該放在NIZA之前,那么分配NIZB[15]會損壞NIZA[0]。
下面是部分重寫,其中我使用了一個輸入子程式,以便不必重復我自己。
mov eax, unos1
mov ebx, NIZA
call MyInput
mov eax, unos2
mov ebx, NIZB
call MyInput
xor esi, esi
more:
movq mm0, qword [NIZA esi]
paddw mm0, qword [NIZB esi]
movq qword [NIZC esi], mm0
add esi, 8
cmp esi, 32
jb more
emms ; (*)
...
MyInput:
call print_string
call print_nl
xor esi, esi
.more:
call read_int ; -> EAX
mov [ebx esi], ax
add esi, 2
cmp esi, 32 ; Repeat 16 times
jb .more
ret
(*) 有關emms(空 MMX 狀態)的資訊,請參閱https://www.felixcloutier.com/x86/emms
提示:您可以mov ax, [esi] movsx eax, ax在一條指令中寫入:movsx eax, word [esi].
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/365842.html
