我首先想问一下,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
答案 0 :(得分:1)
您当前的代码确实需要两个向量,并计算其产品。
vec1: [ 3, 4, 7, 11, 3]
vec2: [ 2, 6, 3, 1, 0]
result = 3*2 + 4*6 + 7*3 + 11*1 + 3*0 = 62
(敢于通过运行当前代码验证?)
所以:
它会跳过前两对矢量数
我会理解这个计算(对于相同的向量):
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)。
循环中的剩余产品计算可以保持不变,无需更改。