2017-11-29 17 views
0

내가 먼저 물어보고 싶은 Stackoverflow AS88 어셈블리 언어에 대한 답변을 찾을 수있는 적절한 장소입니까? 그렇지 않으면 누군가 나를 더 유익한 장소로 안내 할 수 있습니까? 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

당신은 Coding4Fun @ '코드 검토'커뮤니티 – Coding4Fun

+0

에 질문을 할 수 있습니다..이 코드 리뷰 질문하지 않습니다 그들은 요구하고있다 이 코드를 특별한 방법으로 변경하는 방법 –

+0

게시물을 작성하는 경우 as88? –

답변

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 서브 루틴으로 조정하면 현재 코드와 동일한 인수를 취할 수 있습니다.

그런 다음 조정 후 cx <= 0 일 때 sub cx,2과 0 결과를 반환 할 수 있습니다. 스택의 사용으로 인해 건너 뛸 때 오류가 발생할 수 있으므로 완전히 분리 된 코드 분기를 사용하는 것이 좋습니다. 전체 계산 루프). 또는 인수가 크기가 5 인 하드 코딩 된 벡터 데이터 만있는 경우 조정 된 벡터 크기를 테스트 할 필요가 없습니다.)

그럼 sidi 점 각 벡터의 첫 번째 요소의 각 벡터 (처음 두 값을 스킵 있으므로 2 × 2 = 4 (2 소자 둘 진행해야하고 WORD 크기는 2이다. 루프의 나머지 제품의 계산은 그대로 머물 수

는 변화가 필요하지

+1

변경이 엄격하게 * 필요 * 아니지만, 현재 루프는 매우 끔찍합니다. 스택에 누적기를 사용합니다! 그러나 BX는 무료입니다. 또 다른 대안은 메모리에 엔드 포인터를 유지하여 루프 종료 조건이'cmp si, [bp-2]'/'jb'가되도록하는 것입니다. 따라서 메모리 피연산자는 읽기 전용입니다. –

+0

어떻게 모든 숫자를 더하기 위해 글로벌 변수 또는 무언가를 만들 수 있습니까? 이 경우처럼 나는 40을 얻고 제품 메시지와 함께 그것을 인쇄 할 것인가? 이것이 vecmul 섹션에 있을까요? – FareenC

+0

@FareenC 당신이 게시 한 코드를 전혀 이해하지 못하겠습니까? 코드 작성을 모르는 경우 프로그래머를 고용하십시오. 아니면 당신이 할 수없는 일을하지 마십시오. 이것이 약간의 학교 과제라면, 당신은 그 코드를 이해할 가능성이 매우 높기 때문에, 어셈블리에 대한 책을 얻고 강의 정보 등을 얻고 몇 달을 보내십시오. 그런 다음이 코드로 돌아갑니다. (현재 코드는 결과를 저장하기 위해 "global"'inprod'를 사용합니다,'vecmul' 내에 어떤 전역 변수도 사용하지 않고 오직 로컬 스택 메모리 만 사용합니다). – Ped7g