ايران ويج

نسخه‌ی کامل: در خاست کمک
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام من میخوام این کد رو به زبان اسمبلی چاپ کنه یعنی خروجیش کد اسمبلی باشه
a=2+2
البته چهار عمل اصلیش رو +*-/
(۳۰-آذر-۱۳۹۴, ۲۰:۴۰:۳۳)no.a نوشته است: [ -> ]سلام من میخوام این کد رو به زبان اسمبلی چاپ کنه یعنی خروجیش کد اسمبلی باشه
a=2+2
البته چهار عمل اصلیش رو +*-/



سلام قبل از سوال یک سرچ کوچولو بکنید
برنامه مربوط به جمع ساده دو عدد است که برنامه از کاربر درخواست می کند و از طریق صفحه کلید وارد می شوند.

این اعداد می توانند بین 32768 - و 32767 باشند که پس از وارد کردن اعداد، مجموع آنها در خروجی چاپ می گردد.
کد:
; this sample gets two numbers from the user,
; then it calculates the sum of these numbers,
; and prints it out.

name "calc"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; these maros are copied from emu8086.inc ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; this macro prints a string that is given as a parameter, example:
; PRINTN 'hello world!'
; the same as PRINT, but new line is automatically added.
PRINTN   MACRO   sdat
LOCAL   next_char, s_dcl, printed, skip_dcl

PUSH    AX      ; store registers...
PUSH    SI      ;

JMP     skip_dcl        ; skip declaration.
       s_dcl DB sdat, 0Dh,0Ah, 0

skip_dcl:
       LEA     SI, s_dcl
       
next_char:      
       MOV     AL, CS:[SI]
       CMP     AL, 0
       JZ      printed
       INC     SI
       MOV     AH, 0Eh ; teletype function.
       INT     10h
       JMP     next_char
printed:

POP     SI      ; re-store registers...
POP     AX      ;
ENDM

; this macro prints a char in AL and advances
; the current cursor position:
PUTC    MACRO   char
       PUSH    AX
       MOV     AL, char
       MOV     AH, 0Eh
       INT     10h    
       POP     AX
ENDM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;




org     100h







jmp     start   ; skip data.
 
msg1  db 0Dh,0Ah, 'input numbers in this range: [-32768..32767]', 0Dh,0Ah
     db 0Dh,0Ah, 'enter first number: $'

msg2  db 0Dh,0Ah, 'enter second number: $'

msg3  db 0Dh,0Ah, 'the sum is: $'

; declaration of variable:
num  dw ?

start:


; print first message
mov dx, offset msg1
mov ah, 9
int 21h


call    scan_num

; keep first number:
mov     num, cx


; print second message
mov dx, offset msg2
mov ah, 9
int 21h


call    scan_num


; add numbers:
add     num, cx
jo      overflow


; print the result:
mov dx, offset msg3
mov ah, 9
int 21h


mov     ax, num
call    print_num

jmp     exit

; process overlow error:
overflow:
 
  printn 'we have overflow!'


exit:

; wait for any key press:
mov ah, 0
int 16h

ret   ; return control to operating system.






;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; these functions are copied from emu8086.inc ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


; gets the multi-digit SIGNED number from the keyboard,
; and stores the result in CX register:
SCAN_NUM        PROC    NEAR
       PUSH    DX
       PUSH    AX
       PUSH    SI
       
       MOV     CX, 0

       ; reset flag:
       MOV     CS:make_minus, 0

next_digit:

       ; get char from keyboard
       ; into AL:
       MOV     AH, 00h
       INT     16h
       ; and print it:
       MOV     AH, 0Eh
       INT     10h

       ; check for MINUS:
       CMP     AL, '-'
       JE      set_minus

       ; check for ENTER key:
       CMP     AL, 0Dh  ; carriage return?
       JNE     not_cr
       JMP     stop_input
not_cr:


       CMP     AL, 8                   ; 'BACKSPACE' pressed?
       JNE     backspace_checked
       MOV     DX, 0                   ; remove last digit by
       MOV     AX, CX                  ; division:
       DIV     CS:ten                  ; AX = DX:AX / 10 (DX-rem).
       MOV     CX, AX
       PUTC    ' '                     ; clear position.
       PUTC    8                       ; backspace again.
       JMP     next_digit
backspace_checked:


       ; allow only digits:
       CMP     AL, '0'
       JAE     ok_AE_0
       JMP     remove_not_digit
ok_AE_0:        
       CMP     AL, '9'
       JBE     ok_digit
remove_not_digit:      
       PUTC    8       ; backspace.
       PUTC    ' '     ; clear last entered not digit.
       PUTC    8       ; backspace again.        
       JMP     next_digit ; wait for next input.      
ok_digit:


       ; multiply CX by 10 (first time the result is zero)
       PUSH    AX
       MOV     AX, CX
       MUL     CS:ten                  ; DX:AX = AX*10
       MOV     CX, AX
       POP     AX

       ; check if the number is too big
       ; (result should be 16 bits)
       CMP     DX, 0
       JNE     too_big

       ; convert from ASCII code:
       SUB     AL, 30h

       ; add AL to CX:
       MOV     AH, 0
       MOV     DX, CX      ; backup, in case the result will be too big.
       ADD     CX, AX
       JC      too_big2    ; jump if the number is too big.

       JMP     next_digit

set_minus:
       MOV     CS:make_minus, 1
       JMP     next_digit

too_big2:
       MOV     CX, DX      ; restore the backuped value before add.
       MOV     DX, 0       ; DX was zero before backup!
too_big:
       MOV     AX, CX
       DIV     CS:ten  ; reverse last DX:AX = AX*10, make AX = DX:AX / 10
       MOV     CX, AX
       PUTC    8       ; backspace.
       PUTC    ' '     ; clear last entered digit.
       PUTC    8       ; backspace again.        
       JMP     next_digit ; wait for Enter/Backspace.
       
       
stop_input:
       ; check flag:
       CMP     CS:make_minus, 0
       JE      not_minus
       NEG     CX
not_minus:

       POP     SI
       POP     AX
       POP     DX
       RET
make_minus      DB      ?       ; used as a flag.
SCAN_NUM        ENDP





; this procedure prints number in AX,
; used with PRINT_NUM_UNS to print signed numbers:
PRINT_NUM       PROC    NEAR
       PUSH    DX
       PUSH    AX

       CMP     AX, 0
       JNZ     not_zero

       PUTC    '0'
       JMP     printed

not_zero:
       ; the check SIGN of AX,
       ; make absolute if it's negative:
       CMP     AX, 0
       JNS     positive
       NEG     AX

       PUTC    '-'

positive:
       CALL    PRINT_NUM_UNS
printed:
       POP     AX
       POP     DX
       RET
PRINT_NUM       ENDP



; this procedure prints out an unsigned
; number in AX (not just a single digit)
; allowed values are from 0 to 65535 (FFFF)
PRINT_NUM_UNS   PROC    NEAR
       PUSH    AX
       PUSH    BX
       PUSH    CX
       PUSH    DX

       ; flag to prevent printing zeros before number:
       MOV     CX, 1

       ; (result of "/ 10000" is always less or equal to 9).
       MOV     BX, 10000       ; 2710h - divider.

       ; AX is zero?
       CMP     AX, 0
       JZ      print_zero

begin_print:

       ; check divider (if zero go to end_print):
       CMP     BX,0
       JZ      end_print

       ; avoid printing zeros before number:
       CMP     CX, 0
       JE      calc
       ; if AX<BX then result of DIV will be zero:
       CMP     AX, BX
       JB      skip
calc:
       MOV     CX, 0   ; set flag.

       MOV     DX, 0
       DIV     BX      ; AX = DX:AX / BX   (DX=remainder).

       ; print last digit
       ; AH is always ZERO, so it's ignored
       ADD     AL, 30h    ; convert to ASCII code.
       PUTC    AL


       MOV     AX, DX  ; get remainder from last div.

skip:
       ; calculate BX=BX/10
       PUSH    AX
       MOV     DX, 0
       MOV     AX, BX
       DIV     CS:ten  ; AX = DX:AX / 10   (DX=remainder).
       MOV     BX, AX
       POP     AX

       JMP     begin_print
       
print_zero:
       PUTC    '0'
       
end_print:

       POP     DX
       POP     CX
       POP     BX
       POP     AX
       RET
PRINT_NUM_UNS   ENDP



ten             DW      10      ; used as multiplier/divider by SCAN_NUM & PRINT_NUM_UNS.
واسه سه عمل دیگه خودتون سرچ کنید