AS88汇编语言源文件编辑

时间:2017-11-29 21:06:38

标签: assembly x86-16 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

1 个答案:

答案 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*24*6对。

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

然后你可以检查向量的大小是否是3+(即sub cx,2并且在调整后cx <= 0时返回0结果 - 可能使用完全独立的代码退出分支,作为堆栈的用法跳过整个计算循环时容易出错。或者,如果您知道参数只是那些大小为5的硬编码矢量数据,则无需测试调整后的矢量大小。

然后跳过每个向量的前两个值(sidi指向每个向量的第一个元素,因此你必须将它们推进2 * 2 = 4(2个元素, WORD大小为2)。

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