組合語言 多位數輸入輸出 迴圈設計實驗

2021-10-23 07:22:51 字數 4343 閱讀 5922

;多位數的輸入輸出

datas segment

;此處輸入資料段**

x dw ?

n dw 10

datas ends

stacks segment

;此處輸入堆疊段**

db 100

dup(?)

stacks ends

codes segment

assume cs:codes,ds:datas,ss:stacks

start:

mov ax,datas

mov ds,ax

;先把輸入的字串變為十進位制數值

mov bx,

0;儲存到bx

l1: mov ah,

1int

21h ;al=輸入數字的ascii碼

cmp al,

0dh ;

0dh是回車

jz l2 ;輸入結束

sub al,

30h

mov ah,

0 xchg bx,ax

mul n

add bx,ax;

jmp l1

l2: mov dl,

0dh ;dl為回車

mov ah,

2 int 21h ;dl=輸出字元

mov x,bx ;把輸入的結果存到x

mov ax,x

mov bx,

10 mov cx,

0 mov dx,

0l3:

div bx ;ax/bx,bx為除數,dx=餘數 ax=商

push dx

inc cx ;記錄位數

cwd ;字轉化為雙字,al-

>ax

cmp ax,

0;被除數不為0繼續

jnz l3

l4: pop dx

add dl,

'0'

mov ah,

2 int 21h

loop l4

mov ah,

4ch int 21h

codes ends

end start

2、 從自然數1開始累加,直到累加和大於60000為止,顯示累加的自然數的個數和累加和。顯示格式為:1+2+…+n=sum

其中n為累加個數,sum為累加和。

stack segment 

db 10

dup(?)

stack ends

data segment

n dw ?

sum dw ?

infor1 db "1+2+...+$"

data ends

code segment

assume ds:data,cs:code,ss:stack

start: mov ax,data

mov ds,ax

mov ax,

0;存放累加和

mov bx,

0;存放次數

loop1: inc bx

add ax,bx

cmp ax,

60000

;比較是否小於60000

jb loop1

mov n,bx

mov sum,ax

;輸出結果

mov dx,offset infor1

mov ah,

09h int

21h

;輸出多位數n

mov ax,n

mov cx,

0;記錄位數

mov bx,

10;用來取餘

mov dx,

0loop2: div bx ;ax/bx,ax=商,dx=餘數

push dx ;餘數入棧!

inc cx; 位數加1

cwd ;al-

>ax

cmp ax,

0 jnz loop2;ax不為0

loop3: pop dx ;從棧裡面輸出,出棧到dx(16位!)

add dl,

'0' mov ah,

02h int

21h loop loop3

;輸出=

mov dl,

'=' mov ah ,

02h int

21h

;輸出多位數sum

mov ax,sum

mov cx,

0;記錄位數

mov bx,

10;用來取餘

mov dx,

0loop4: div bx ;ax/bx,ax=商,dx=餘數

push dx ;餘數入棧!

inc cx; 位數加1

cwd ;al-

>ax

cmp ax,

0 jnz loop4;ax不為0

loop5: pop dx ;從棧裡面輸出,出棧到dx(16位!)

add dl,

'0' mov ah,

02h int

21h loop loop5

mov ah,

4ch int

21hcode ends

end start

3,計算1+2+…+n=?,其中n通過鍵盤輸入,累加和小於216。要求在螢幕上提供如下資訊:

please input a number(1-361): ;出現此資訊後通過鍵盤輸入乙個小於362的無符號整數,

;使累加和小於乙個16位無符號二進位制數所能表示的範圍

1+2+…+n=sum ;其中n為使用者輸入的數,sum為所求的累加和

data  segment

inf1 db "please input a number (1-361):$"

ibuf db 7,0

,6dup(?)

obuf db 6 dup (?)

data ends

code segment

assume cs: code, ds: data

start: mov ax, data

mov ds, ax

mov cx, ax

mov dx,offset inf1;輸出提示資訊

mov ah,

09h int

21h

mov dx,offset ibuf;輸入乙個十進位制數

mov ah,

0ah;鍵入並顯示字串

int21h mov cl,ibuf+

1;十進位制數的位數送cx

mov ch ,

0 mov si,offset ibuf+

2;指向輸入的第乙個字元(最高位)

mov ax,

0;開始將十進位制數轉換為二進位制數

again: mov dx,10;

((0*

10+a4)*10

+…)*

10+a0

mul dx ;ax*dx

and byte ptr[si]

,0fh

add al,

[si]

adc ah,

0 inc si

loop again

mov cx,ax

mov ax,

0 mov bx,1

loop2: add ax,bx

inc bx

loop loop2

mov bx,offset obuf+

5 mov byte ptr [bx]

,'$'

mov cx,

10;做(dx):(ax)/

10運算

loop1: mov dx,

0;被除數高16位清0

div cx

add dl,

30h ;將dl中的一位十進位制數轉換為ascii碼

dec bx

mov [bx]

, dl

or ax, ax

jnz loop1 ;判斷商是否為0,不為0繼續

mov dl,

0ah;換行

mov ah,

02h int

21h mov dx, bx ;顯示轉換得到的十進位制數

mov ah,

09h int 21h

mov ah,

4ch int 21h

code ends

end start

組合語言輸出乙個多位數

研究了一下怎麼用組合語言 求 1 20 的和 並且列印到螢幕上,難點就在於列印。大概的思路就是 每次 除10,把餘數儲存到陣列中,最後把陣列倒序輸出。輸出乙個 小於 2560 的多位數 model small data num db 0,0 0,0 0,0 0 定義乙個陣列num stack db ...

組合語言 十進位制輸入輸出

model small stack 100h data string db please input a munber s dw 0 sur dw 0 code start mov ax,data mov ds,ax mov dx,offset string 輸出字串string mov ah,09...

組合語言實現字串的輸入,輸出

1.了解 int 21h 的09h 號中斷呼叫 輸出字串 lea dx,字串的開頭 或 mov dx,offset字串的開頭 mov ah,09h int 21h 2.在定義字串的時候要在末尾加上 作為字串的結束標誌。3.了解 int 21h 的0ah 號中斷呼叫 輸入字串 lea dx,字串的開頭...