【问题标题】:My string isn't printing我的字符串没有打印
【发布时间】:2017-09-20 20:07:32
【问题描述】:

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

 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

【问题讨论】:

  • 每个函数的末尾都需要一个 RET 指令。
  • 我该怎么做?
  • 首先移动 DOS 退出中断 MOV AH,4CH ;saida do dos INT 21H ;saindo 代码使其位于 main endp 之前,然后在 PULA_LINHA ENDP 之前放置一条 RET 指令
  • 现在可以了,谢谢!

标签: string assembly printing x86-16 dos


【解决方案1】:

正如迈克尔在他的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2021-03-06
    • 2012-11-28
    • 1970-01-01
    • 2023-03-03
    • 2015-01-16
    相关资源
    最近更新 更多