assembly 无法运行汇编程序

b1uwtaje  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(241)

因此,该项目基本上是关于编码一个计算器,可以使用4个基本操作:加,减,乘,除,在汇编语言。我很抱歉,但注解是用法语写的,我想你不会需要他们来理解代码无论如何。
可能有帮助:我的老师说我报告了一个不属于它所在位置的堆栈段。当我运行代码时,我得到了这些错误:

(56) error A2006: undefined symbol : scan_num
(89) error A2006: undefined symbol : scan_num
(100)error A2006: undefined symbol : do_plus
(103)error A2006: undefined symbol : do_minus
(106) error A2006: undefined symbol : do_mult
(109) error A2006: undefined symbol : do_div
(128) error A2006: undefined symbol : main

下面是我的代码:

SSEG  SEGMENT      STACK
      DB          32 DUP("STACK---")
SSEG  ENDS
;===========================================================code segment
            assume cs:cseg, ds:cseg, es:cseg
cseg        segment

            org 100h
;----------

name "CALCULATRICE"

PUTC    MACRO char
        PUSH AX
        MOV AL,char
        MOV AH, 0Eh
        INT 10h
        POP AX
ENDM

jmp start

;------------- Zone de donnée

msg0    db "BELLAL MOHAMED BUT1 2021/2022",0Dh,0Ah
        db "CALCULATOR3000 gerant les quatres opérations basiques ( + - * / )",0Dh,0Ah,"$"
msg1    db 0Dh,0Ah,0Dh,0Ah, "Entrer le premier terme de l'opération: $"
msg2    db "Choisissez l'opérateur à utiliser: + - * / : $"
msg3    db "Entrer le second terme de l'opération: $"
msg4    db 0Dh, 0Ah,"Le résultat est: $"
msg5    db 0Dh, 0Ah," ",0Dh,0Ah,"$"
err1    db "Saisie incorrecte",0Dh,0Ah,"$"
smth    db "Et .... $"

opr db "?" ; variable contenant l'opérateur

num1 dw ? ; variable contenant le premier terme de l'opération
num2 dw ? ; variable contenant le deuxième terme de l'opération

;--------------- PROGRAMME

start:
mov dx, offset msg0
mov ah, 9
int 21h

lea dx, msg1
mov ah, 09h     ; afficher le premier message
int 21h

; récupérer un nombre saisi par l'utilisateur et on le stock dans
; le registre CX

call scan_num

mov num1, cx ; stocker le nombre dans num1

; nouvelle ligne
putc 0Dh
putc 0Ah

lea dx, msg2
mov ah, 09h         ; affiche le deuxième message
int 21h

; récupérer l'opérateur
mov ah, 1
int 21h
mov opr, al

; nouvelle ligne
putc 0Dh
putc 0Ah

cmp opr, "q"        ; q pour quitter
je exit

cmp opr, "*"
jb wrong_opr
cmp opr, "/"
ja wrong_opr

lea dx, msg3
mov ah, 09h
int 21h

call scan_num

mov num2, cx

lea dx, msg4
mov ah, 09h
int 21h

;------------- CALCULER

cmp opr, "+"
je do_plus

cmp opr, "-"
je do_minus

cmp opr, "*"
je do_mult

cmp opr, "/"
je do_div

;---------- CAS PAR DEFAUT

wrong_opr:
lea dx, err1
mov ah, 09h
int 21h

exit:

lea dx, msg5
mov ah, 09h
int 21h

mov ah, 0

;---------
cseg        ends
            end main
eblbsuwk

eblbsuwk1#

如果使用代码标签作为指令操作数,则它还需要存在于代码中的某个地方,在它自己的行后面有一个冒号,或者在汇编程序允许的情况下有一个proc语句。
您可能已经注意到,在wrong_opr中没有看到类似的错误消息,这是因为在源代码中有该标签。

cmp opr, "*"
jb wrong_opr
cmp opr, "/"
ja wrong_opr

; rest of your code

wrong_opr:    ;the 'jb' and 'ja' statements will take you here.

您得到了其他标签的错误消息,因为它们不在您的程序中。
现在我会这么做:

;--------------- PROGRAMME

start:
main:          ;add this here to "balance" your "end main"
mov dx, offset msg0
mov ah, 9
int 21h

然后你可以做下面的事情,我故意用一种次优的方式来写,以使它更容易阅读。

cmp opr, "+"
je do_plus

cmp opr, "-"
je do_minus

cmp opr, "*"
je do_mult

cmp opr, "/"
je do_div
jmp wrong_opr   ;if none of the above, goto default


do_plus:
; your code for what happens when user types + goes here
jmp exit

do_minus:
; your code for what happens when user types - goes here
jmp exit

do_mult:
; your code for what happens when user types * goes here
jmp exit

do_div:
; your code for what happens when user types / goes here
jmp exit


;---------- CAS PAR DEFAUT

wrong_opr:
lea dx, err1
mov ah, 09h
int 21h

exit:

lea dx, msg5
mov ah, 09h
int 21h

; you need to put the exit code here or your computer will crash.
mov ax,4c00h
int 21h

;down here you can safely put any functions you wish
scan_num:
;you can put your code here for how you scan the user input

ret

;---------
end main   ;I'm not sure but I think these should be in this order.
cseg        ends

这应该足以消除这些错误。当然,您还必须弄清楚您希望如何完成任务。

相关问题