我首先想问,stackoverflow是找到有关AS88汇编语言答案的合适场所吗?如果没有,请引导我去一个更有益的地方?
我要发布我的问题,以防万一:
我必须编辑以下源代码,以便它在内部生产计算中跳过前两个矢量号。我不确定这是什么意思,这是我的代码,如果有人可以解释或帮助我的回答,我会感谢它。
! This program multiplies two vectors
! It shows a subroutine with arguments and
! a local variable. See section 9.8.3.
_EXIT = 1 ! 1
_PRINTF = 127 ! 2
.SECT .TEXT ! 3
inpstart: ! 4
MOV BP,SP ! 5
PUSH vec2 ! 6
PUSH vec1 ! 7
MOV CX,vec2-vec1 ! 8
SHR CX,1 ! 9
PUSH CX ! 10
CALL vecmul ! 11
MOV (inprod),AX ! 12
PUSH AX ! 13
PUSH pfmt ! 14
PUSH _PRINTF ! 15
SYS ! 16
ADD SP,12 ! 17
PUSH 0 ! 18
PUSH _EXIT ! 19
SYS ! 20
vecmul: ! 21
PUSH BP ! 22
MOV BP,SP ! 23
MOV CX,4(BP) ! 24
MOV SI,6(BP) ! 25
MOV DI,8(BP) ! 26
PUSH 0 ! 27
1: LODS ! 28
MUL (DI) ! 29
ADD -2(BP),AX ! 30
ADD DI,2 ! 31
LOOP 1b ! 32
POP AX ! 33
POP BP ! 34
RET ! 35
.SECT .DATA ! 36
pfmt: .ASCIZ "The in product is %d!nThe sum is !"! 37
.ALIGN 2 ! 38
vec1: .WORD 3,4,7,11,3 ! 39
vec2: .WORD 2,6,3,1,0 ! 40
.SECT .BSS ! 41
inprod: .SPACE 2 ! 42
您的当前代码确实需要两个向量,并计算其产品。
vec1: [ 3, 4, 7, 11, 3]
vec2: [ 2, 6, 3, 1, 0]
result = 3*2 + 4*6 + 7*3 + 11*1 + 3*0 = 62
(敢通过运行当前代码来验证?)
so:
它跳过前两对矢量号
我会理解此计算(对于相同的向量):
result = 7*3 + 11*1 + 3*0 = 32
3*2
和4*6
对跳过。
您可以通过将vecmul
子例程调整为某些vecmul_2pairskip
子例程来修改当前代码,该子例程将与当前相同的参数。
然后,您可以检查向量的大小是否为3 (即sub cx,2
并在调整后cx <= 0
时返回0结果 - 可能使用代码的完全单独的出口分支,因为堆栈的使用使整个过程时都容易出现错误计算循环)。或者,如果您知道参数仅是大小5的硬编码向量数据,则无需测试调整后的向量大小。
然后跳过每个向量的前两个值( si
和 di
点指向每个向量的第一个元素,因此您必须将它们都提高到2*2 = 4(2个元素,而WORD
大小为2)。/p>
循环中剩余的产品计算可以保持原样,无需更改。