2012-05-01 5 views
0

왜 'show_msg'기능이 제대로 작동하지 않습니까? 아래 처음에 어떤 주소 pop ax 될 것입니다 -이 프로그램의 경우 -16bit/ASM : int 21h를 사용한 간단한 함수?

org 100h 

push str1 
call show_msg 
pop ax 

mov ah, 4Ch 
int 21h 

show_msg: 
mov ah, 9 
mov bx, sp ;in 16bit bx is the only register that can act as a pointer (besides di and si) 
mov dx, [bx] 
int 21h 
ret 


str1 db 'Hello world!$' 
+0

어떤 시스템과 운영 체제가 제대로 작동 할 것으로 예상됩니까? – ShinTakezou

+0

16 비트 DOS에서 ... – user1091856

답변

4

대부분의 아마 함수에 대한 항목에 따라 [sp]은 반환 코드의 주소를 포함하기 때문이다. mov dx, [bx]mov dx, [bx+2]으로 변경해보십시오. 그러면 검색 할 함수에 대한 항목 앞에 푸시 된 인수 값이 생깁니다.

1

코드에 근본적인 결함이 있습니다.

먼저 bp를 포인터로 사용할 수도 있습니다.

bx 레지스터가 아닌 bp 레지스터를 사용하여 스택을 인덱싱해야합니다. [bp] 양식은 기본적으로 SS 세그먼트를 사용하지만 [bx] 양식은 DS를 기본 세그먼트로 사용합니다. 즉, DS! = SS 인 경우 이 아니며은 [bx]를 사용하지만 다른 정의되지 않은 값을 사용하면 스택에 푸시 된 값을 읽지 않습니다.

그래서, 올바른 버전은 다음과 같습니다 : - DX는 않기 때문에

function: 
    mov bp,sp 
    sub sp,amount of space for local storage 

    some code, parameters are [bp+offset], local data are [bp-offset] 

    mov sp,bp 
    ret 
+0

+1. 리얼 모드 프로그래밍을 많이 해본 적은 없기 때문에 레지스터 중 일부에 할당 된 "기본"세그먼트가 있다는 것을 잊어 버리는 경향이 있습니다. 그 문제를 해결해 주셔서 감사합니다. –

0

프로그램이 제대로 작동하지 않을 것 -이 기능은 일부 로컬 스토리지, 다음 일반적인 형식이 필요

show_msg: 
    mov bp,sp 
    mov ah,9 
    mov dx,[bp+2] 
    int 21h 
    ret 

경우 NOT은 "str1"의 주소를 가리 킵니다.

먼저 str1의 주소를 SP가 가리키는 스택으로 푸시합니다. 그리고 그것은 아무런 문제가되지 않습니다.

하지만 str1을 인쇄하기 위해 "show_str"함수를 호출하면 원래 IP 값이 SP가 가리키는 스택에 푸시되기 때문에 SP는 더 이상 str1을 가리 키지 않습니다.

SP의 변경을 알지 못했지만 SP의 값을 인쇄 할 문자열의 주소를 저장해야하는 DX로 전달하려고 시도했습니다.

제 조언은 프로그램을 작성하는 데 "정상적인"스타일을 사용해야한다는 것입니다. 언어 자체의 비밀을 모색하지 않는 한 인생을 편하게 만들어주기 때문입니다.

이것은 내 프로그램입니다.

;file: showmsg.asm (.COM) 
    ;nasm -fbin showmsg.asm -o showmsg.com 

    org 0x100 
    mov ax, cs 
    mov ds, ax 

    mov ax, str1  ;Transmit parameter to show_msg through AX 
    call show_msg 

mov ax, 4c00h 
int 21h 

show_msg:   ;the address offset of the string is stored in ax 
    mov dx, ax  ;DS:DX=string address 
    mov ax, 0900h ;AH=09 
    int 21h 
    ret 
str1: db "Hello, world!$" 
관련 문제