2014-11-07 2 views
0

매개 변수로 선언 한 변수를 전달하는 방법에 대한 도움이 필요합니다. 교수님이 잘 설명하지 못했고 그에게 질문을 할 때 그는 책을 읽으라고 말씀 하셨지만, 나는 그 책을 완전히 이해하지 못하기 때문에 내가 가진 질문이 있습니다.어셈블리 언어 x8086 - 전달 매개 변수

글쎄, 기본적으로이 숙제에서는 내 변수 (예 : userMsg, printSum, sumMessage, printW, wMessage 등)를 전달하는 것과 같은 절차에 매개 변수를 전달해야합니다. 현재 시작하는 방법에 관해서는 현재 우둔합니다.

내 코드를 보는 다른 사람이 주 프로 시저와 선언에서 변수 이름을 수정하고 프로그램을 완벽하게 실행할 수 있도록 String을 매개 변수로 전달하는 방법을 잘 모르겠습니다. 여기

는 내가 지금까지 무엇을 가지고 : 도움에 미리

.model small 
.stack 100h 
.data 

Y dw ? 
W dw ? 
Sum dw ? 
Space db ,0ah, '$' 
userMsg db "Please enter your number: ", '$' 
printSum db "The Sum is: ", 
sumMessage db 0,0,0,0,0  ,0dh, 0ah 
printW db "W is: " 
wMessage db 0,0,0,0,0 ,0dh, 0ah, '$' 


.code 
main proc 
mov ax,@data 
mov ds,ax 


call getInput 
    call calcInput 
call modifySum  
call displaySum 

mov ax,4C00h 
int 21h 

main endp 




;getInput procedure 
getInput proc 


mov si, 0 
mov cx, 100 

yLoop:        ;Loop to print message asking user to input number 
    mov al, 0 
    mov al, userMsg[si] 
    inc si 
    cmp al, '$' 
    je endY 
    mov dl, al 
    mov ah, 2h 
    int 21h 

loop yLoop 

endY: 
    mov si, 0 
    mov cx, 0 

    mov  cx, 10 
    mov  bx, 0 
loop1: 
    mov  ah,1h 
    int  21h 
    cmp  al,0dh 
    je  endloop 
    sub al, 30h 
    mov ah, 0h 
    mov si, ax 
    mov ax, bx 
    mul cx 
    mov bx, ax 
    add bx,si 
    jmp  loop1 
endloop: 


ret 

getInput endp 


;calcInput procedure 
calcInput proc 

mov Y, bx 

mov ax,Y  ;Store Y in ax register 
sub ax,1 
mov Y, ax 
mov ax, 0 

mov Sum,36   ; add 36 to Sum 
mov bx,Y 
add Sum,bx   ; add 36 and Y into Sum 
mov ax,Y 

mov bx,4   ; take Y and divide by 4 
mov dx,0 
idiv bx 
add Sum,ax 

mov ax,Y   ;take Y and divide by 100 
mov bx,100 
mov dx,0 
idiv bx 
add Sum,ax 

mov bx,7 
mov dx,0      ; calculate W 
idiv bx 
mov W,dx 
add W,1 
mov dx, W 

ret    


calcInput endp 


;modifySum procedure 
modifySum proc 


add dl, 30h 
mov wMessage+1, dl 

mov ax, 0 
mov dx, 0 
mov ax,Sum 
mov cx, 10   ;start modding the number 2553 
idiv cx 

mov si, 4 

sumLoop:     ;Loop to mod and store 2553 into sumMessage 
    add dl, 30h 
    mov sumMessage+[si], dl 
    mov dx, 0 
    mov cx, 10 
    idiv cx 
    dec si 
    cmp si, 0h 
    je endSum 

loop sumLoop 

endSum: 

mov si, 1 

removeZero:     ;Locate zeros 

    cmp sumMessage+[si], 30h 
    je useSpace 
    jmp endRemove 

loop removeZero    

useSpace:      ;Replace leading zeros with a blank space 

    mov sumMessage+[si], 20h 
    inc si 
    jmp removeZero 


loop useSpace 

endRemove: 

ret   

modifySum endp 


;displaySum procedure 
displaySum proc 


mov ax, 0    ;Print a newline after user input 
mov dl, Space 
mov ah, 2h 
int 21h 




mov si, 0 
mov cl, printSum 

L1:        ;Loop to print out "Sum is : 2553 
    mov al, 0 
    mov al, printSum[si] 
    inc si 
    cmp al, '$' 
    je end_loop 
    mov dl, al 
    mov ah, 2h 
    int 21h 

loop L1: 

end_loop: 

ret 


displaySum endp 

end main 

감사합니다!

+0

인내심과)) 책을 읽고 :

 mov ax, Y lea bx, userMsg push bx push ax call example ; Y, offset userMsg add sp,4 

문자열을 표시합니다. [이것을 확인하십시오] (https://courses.engr.illinois.edu/ece390/books/artofasm/CH11/CH11-1.html) – qwr

+0

[** 어셈블리 언어 확인 제 11 장 **] (http : /www.ic.unicamp.br/~pannain/mc404/aulas/pdfs/Art%20Of%20Intel%20x86%20Assembly.pdf) – qwr

+0

함수를 호출하고 객체로 컴파일하는 간단한 C 함수를 작성합니다 (일반적으로 -c 옵션 또는/c) 그런 다음이를 해체하고 컴파일러가 전달 된 매개 변수를 어떻게 그리고 어디에 넣는 지 정확히 확인하십시오. 그런 다음 책이하는 일에 적용하고, 수신 끝에서 동일한 작업을 수행하고, 매개 변수를 함께 추가하는 더미 함수를 만듭니다. 호출 규칙이 하나씩 다를 수 있으므로 asm 태스크와 함께 사용할 동일한 컴파일러를 사용하십시오. –

답변

1

코드를 기반으로 한 예입니다.

example proc 
     push bp     ;save bp 
     mov  bp,sp     ;set bp = sp 
;          ;2[bp] = return address 
;          ;4[bp] = first parameter 
;          ;6[bp] = second parameter 
     mov  dx,6[bp]    ;display message 
     mov  ah,09h 
     int  21h 
;  ... 
     pop  bp 
     ret 
+0

그래서이 코드 조각은 내 주된 절차에 포함될 것입니다. 그러나 userMsg의 주소를 bx로 옮기는 것이 이해되는 것으로 생각하기 때문에이 코드가 어떻게 작동하는지 혼란 스럽습니다. 나는 내 userMsg 문자열의 각 문자를 인쇄해야하는 getInput 프로 시저에 무엇을 넣을 지에 대한 단서가 없습니다. – AlternateRealm

+0

Ohh는 실제로 많은 의미가 있습니다! 이제 교수님이 우리가 mov 아, 2h를 사용하여 메시지를 인쇄하기를 원한다고 생각하기 때문에 userMsg 문자열의 각 문자를 개별적으로 인쇄하고 싶습니다. 그 외, 나머지는 내 변수를 처리하기 위해 Y 코드를 수정하고, calcInput 프로 시저에서는 Y를 이미 Y를 저장 한 레지스터로 대체합니까? – AlternateRealm