AS88汇编语言源文件编辑



我首先想问,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*24*6对跳过。

您可以通过将vecmul子例程调整为某些vecmul_2pairskip子例程来修改当前代码,该子例程将与当前相同的参数。

然后,您可以检查向量的大小是否为3 (即sub cx,2并在调整后cx <= 0时返回0结果 - 可能使用代码的完全单独的出口分支,因为堆栈的使用使整个过程时都容易出现错误计算循环)。或者,如果您知道参数仅是大小5的硬编码向量数据,则无需测试调整后的向量大小。

然后跳过每个向量的前两个值( sidi点指向每个向量的第一个元素,因此您必须将它们都提高到2*2 = 4(2个元素,而WORD大小为2)。/p>

循环中剩余的产品计算可以保持原样,无需更改。