;多位數的輸入輸出
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,字串的開頭...