我的字符串没有打印

时间:2017-09-20 20:07:32

标签: string assembly printing x86-16 dos

我正在做一个汇编计算器,我需要做一个菜单,但我的程序只打印第一个字符串。

 TITLE  CALCULADORA
.MODEL  SMALL
.STACK  100H
.DATA

;menu

MENU    DB  'MENU$'
MSOMA   DB  'Digite 1 para Soma$'
MSUB    DB  'Digite 2 para Subtração$'

.CODE

MAIN PROC

    MOV     AX,@DATA    ;Localizacao do endereco de memoria das variaveis, e colocando-os en AX
    MOV     DS,AX       ;transferindo as dados da memoria em seu local padrao, no caso, DS (Data Stack)

    LEA     DX,MENU     ;Colocando o endereco do menu em DX
    MOV     AH,9        ;funçao de exibicao de string
    INT     21H         ;execucao de AH
    CALL    PULA_LINHA  ;"Chamando" a funcao PULA_LINHA

    LEA     DX,MSOMA    ;Colocando o endereco do menu em DX
    MOV     AH,9        ;funçao de exibicao de string
    INT     21H         ;execucao de AH
    CALL    PULA_LINHA  ;"Chamando" a funcao PULA_LINHA


MAIN ENDP   


PULA_LINHA PROC

    MOV     AH,2        ;inicia a funçao de leitura de caracter
    MOV     DL,0DH      ;caracter para o cursor retornar a posicao inicial
    INT     21H         ;executando o conteudo de AH, que por sua vez printa o conteudo de DL
    MOV     DL,0AH      ;caracter de descer a linha
    INT     21H         ;executando a tarefa

PULA_LINHA ENDP

    MOV     AH,4CH      ;saida do dos
    INT     21H         ;saindo


END  MAIN

1 个答案:

答案 0 :(得分:2)

正如迈克尔已经在他的comment中提到的那样,你“搞砸了”返回的功能,并错误地“返回操作系统”并“回到来电者”:

 TITLE  CALCULADORA
.MODEL  SMALL
.STACK  100H
.DATA

;menu

MENU    DB  'MENU$'
MSOMA   DB  'Digite 1 para Soma$'
MSUB    DB  'Digite 2 para Subtração$'

.CODE

MAIN PROC

    MOV     AX,@DATA    ;Localizacao do endereco de memoria das variaveis, e colocando-os en AX
    MOV     DS,AX       ;transferindo as dados da memoria em seu local padrao, no caso, DS (Data Stack)

    LEA     DX,MENU     ;Colocando o endereco do menu em DX
    MOV     AH,9        ;funçao de exibicao de string
    INT     21H         ;execucao de AH
    CALL    PULA_LINHA  ;"Chamando" a funcao PULA_LINHA

    LEA     DX,MSOMA    ;Colocando o endereco do menu em DX
    MOV     AH,9        ;funçao de exibicao de string
    INT     21H         ;execucao de AH
    CALL    PULA_LINHA  ;"Chamando" a funcao PULA_LINHA

    ; ----------------------------------------------------------<<<<
    ; HERE you want to quit to OS, so the INT 21h/4Ch goes here
    MOV     AH,4CH      ;saida do dos
    INT     21H         ;saindo
    ; ----------------------------------------------------------<<<<


MAIN ENDP   


PULA_LINHA PROC

    MOV     AH,2        ;inicia a funçao de leitura de caracter
    MOV     DL,0DH      ;caracter para o cursor retornar a posicao inicial
    INT     21H         ;executando o conteudo de AH, que por sua vez printa o conteudo de DL
    MOV     DL,0AH      ;caracter de descer a linha
    INT     21H         ;executando a tarefa

    ; ----------------------------------------------------------<<<<
    ; HERE you just want to return to the caller, that's done with
    RET
    ; ----------------------------------------------------------<<<<

PULA_LINHA ENDP



END  MAIN