0

我必须制作一个可以用作计算器的程序。我写了这个:

push ds
push 0000H


data segment
    imsg1 db 13,10,'enter 1st number:$'
    imsg2 db 13,10,'enter 2nd number:$'
    imsg3 db 13,10,'sum:$'
    imsg4 db 13,10,'diff:$'
    imsg5 db 13,10,'div:$'
    imsg6 db 13,10,'product:$'
    num dw ?
    num2 dw ?
data ends
   MOV ax,data
   MOV ds,ax
      mov ah,09h
      mov dx,offset imsg1
      int 21h
   mov cx,0
   mov bx,10
   mov num,0            ; Using num instead of dx, as we usually do, because we have to store another number too.

   r1:mov ah,01h        ; For storing first number
      int 21h          
      cmp al,13
      je yy
      sub al,48
      mov cl,al
      mov ax,num
      mul bx
      add ax,cx
      mov num,ax
      jmp r1  

   yy:
      ;to enter 2nd number  
      mov ah,09h
      mov dx,offset imsg2
      int 21h

       mov cx,0
       mov bx,10
       mov num2,0

       r2:mov ah,01h
       int 21h
       cmp al,13
       je yy1
       sub al,48
       mov cl,al
       mov ax,num2
       mul bx
       add ax,cx
       mov num2,ax
       jmp r2


    yy1:
    ;TO PRINT PROMPT MSG FOR SUM
      mov ah,09h
      mov dx,offset imsg3
      int 21h

      mov ax,num                ; Move the numbers to registers before doing any operation
      mov bx,num2               ; Because we will also need the numbers for other operations
      add ax,bx                 ; Adding and storing in ax
      mov cx,0
      mov bx,10
      mov dx,0
    r3:                                 ; To print the sum
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r3
       mov ah,02h
       print:
        pop dx
        int 21h
       loop print

       ;TO PRINT SUBTRACTION PROMPT
       mov ah,09h
      mov dx,offset imsg4
      int 21h
       mov ax,num
       mov bx,num2
       sub ax,bx                ; Subtracting and storing in ax

       mov cx,0
      mov bx,10
      mov dx,0
    r4:                                 ; Printing the subtracted value
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r4
       mov ah,02h
       print1:
        pop dx
        int 21h
       loop print1

       ;TO PRINT DIVISION PROMPT
       mov ah,09h
       mov dx,offset imsg5
       int 21h
       mov dx,0
       mov ax,num
       mov bx,num2
       div bx                   ; Quotient stored in AX

       mov cx,0
       mov bx,10
       mov dx,0
    r5:                                 ; Printing the Quotient
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r5
       mov ah,02h
       print2:
        pop dx
        int 21h
       loop print2

       ;TO PRINT MULTIPLICATION PROMPT
       mov ah,09h
       mov dx,offset imsg6
       int 21h
       mov dx,0
       mov ax,num
       mov bx,num2
       mul bx                   ; Solution in AX

       mov cx,0
       mov bx,10
       mov dx,0
    r6:                                 ; Printing the solution
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r6
       mov ah,02h
       print3:
        pop dx
        int 21h
       loop print3
ret
main endp
code ends
end main

我有错误:

第 5 行(数据段)解析器:指令预期
第 18 行(mov dx,偏移量 imsg1):逗号或行尾预期
第 39 行(mov dx,偏移量 imsg2):逗号或行尾预期
第 62 行(mov dx,偏移量 imsg3 ): 逗号或行尾预期
第 87 行(mov dx,offset imsg4): 逗号或行尾预期
第 112 行(mov dx,offset imsg5): 逗号或行尾预期
第 138 行(mov dx,offset imsg6):逗号或行尾预期
第 162 行(主 endp):错误:解析器:指令预期
第 163 行(主结束):错误:解析器:指令预期
第 164 行(主结束):错误:解析器:指令预期

自一周以来,我一直在尝试解决它们,但没有成功。对不起,我把整个代码放在这里,但它不是那么长的片段,所以也许有人可以帮助我。谢谢!

4

2 回答 2

2

Easiest thing is probably to use the intended assembler... but I used to do a lot of M/Tasm translations. This is UNTESTED!... but assembles without complaint... My preference would be to assemble it to a .com file, but the original code is for an MZ file (requires a linker).

; nasm -f bin -o myprog.com myprog.asm
; or
; nasm -f obj myprog.asm
; link ???

; for -f obj, remove this line
org 100h

segment data
    imsg1 db 13,10,'enter 1st number:$'
    imsg2 db 13,10,'enter 2nd number:$'
    imsg3 db 13,10,'sum:$'
    imsg4 db 13,10,'diff:$'
    imsg5 db 13,10,'div:$'
    imsg6 db 13,10,'product:$'

segment .bss
    num resw 1
    num2 resw 1

segment .text
; if -f obj, put these lines back
;   MOV ax,data
;   MOV ds,ax

      mov ah,09h
      mov dx, imsg1
      int 21h
   mov cx,0
   mov bx,10
   mov word [num],0            ; Using num instead     of dx, as we usually do, because we have to store another number too.

   r1:mov ah,01h        ; For storing first number
      int 21h          
      cmp al,13
      je yy
      sub al,48
      mov cl,al
      mov ax,[num]
      mul bx
      add ax,cx
      mov [num],ax
      jmp r1  

   yy:
      ;to enter 2nd number  
      mov ah,09h
      mov dx, imsg2
      int 21h

       mov cx,0
       mov bx,10
       mov word [num2],0

       r2:mov ah,01h
       int 21h
       cmp al,13
       je yy1
       sub al,48
       mov cl,al
       mov ax,[num2]
       mul bx
       add ax,cx
       mov [num2],ax
       jmp r2


    yy1:
    ;TO PRINT PROMPT MSG FOR SUM
      mov ah,09h
      mov dx, imsg3
      int 21h

      mov ax,[num]              ; Move the numbers to registers before doing any operation
      mov bx,[num2]             ; Because we will also need the numbers for other operations
      add ax,bx                 ; Adding and storing in ax
      mov cx,0
      mov bx,10
      mov dx,0
    r3:                                 ; To print the sum
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r3
       mov ah,02h
       print:
        pop dx
        int 21h
       loop print

       ;TO PRINT SUBTRACTION PROMPT
       mov ah,09h
      mov dx, imsg4
      int 21h
       mov ax,[num]
       mov bx,[num2]
       sub ax,bx                ; Subtracting and storing in ax

       mov cx,0
      mov bx,10
      mov dx,0
    r4:                                 ; Printing the subtracted value
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r4
       mov ah,02h
       print1:
        pop dx
        int 21h
       loop print1

       ;TO PRINT DIVISION PROMPT
       mov ah,09h
       mov dx, imsg5
       int 21h
       mov dx,0
       mov ax,[num]
       mov bx,[num2]
       div bx                   ; Quotient stored in AX

       mov cx,0
       mov bx,10
       mov dx,0
    r5:                                 ; Printing the Quotient
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r5
       mov ah,02h
       print2:
        pop dx
        int 21h
       loop print2

       ;TO PRINT MULTIPLICATION PROMPT
       mov ah,09h
       mov dx, imsg6
       int 21h
       mov dx,0
       mov ax,[num]
       mov bx,[num2]
       mul bx                   ; Solution in AX

       mov cx,0
       mov bx,10
       mov dx,0
    r6:                                 ; Printing the solution
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r6
       mov ah,02h
       print3:
        pop dx
        int 21h
       loop print3
ret

于 2013-05-30T01:39:44.957 回答
2

在评论部分您提到您想使用 NASM 组装代码,但代码是使用 TASM/MASM 语法编写的。两种风格之间有一些重要的区别:

在 TASM/MASM 语法中:

mov ax,num

将加载存储在ax的值。在 NASM 语法中,它将使用. 要在 NASM 中获得 TASM 行为,您需要在地址周围加上方括号: numax num

mov ax,[num]

在 TASM/MASM 语法中:

mov dx,offset imsg1

加载(实际上是它在段内的偏移量)dx的地址。imsg1在 NASM 语法中,这将简单地变为:

mov dx,imsg1

一些指令(如ENDP)是特定于 TASM/MASM 的,在 NASM 中没有真正的对应物。

于 2013-05-30T05:43:01.383 回答