超高分請教一道組合語言程式設計問題

時間 2021-08-14 22:59:25

1樓:匿名使用者

;內容是編寫由鍵盤輸入10個4位的資料並將這些數由大到小或由小到大進行排序其結果輸出在顯示屏上的程式.

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

data segment

str db 0ah,0dh,"please input a thousand number: ",0ah,0dh,'$'

buf db 5;緩衝區能容納的字元個數

db ?;系統自動存入使用者從鍵盤輸入的字元的個數(不包括回車)

db 5 dup (?);存放使用者從鍵盤輸入的字元的ascii碼(包括回車)

count equ 10

number dw 10 dup (0)

mulnumber dw ?

crlf db 0ah,0dh,'$'

data ends

stack segment

db 16 dup (?)

stack ends

code segment

start:mov ax,data

mov ds,ax;設定好資料段

mov ax,stack

mov ss,ax;設定好資料段

mov sp,10h;設定好棧頂指標

mov di,0

mov cx,count;將10賦值給cx

input:

push cx;因為下面會用到cx,所以為了不覆蓋cx的值,我們將cx存放在棧儲存著

lea dx,str

mov ah,9

int 21h;顯示提示資訊

lea dx,buf

mov ah,10

int 21h;接收使用者從鍵盤輸入的資訊

lea si,buf+2;取buf+2的偏移地址,然後賦值給si,這個buf+2的地址是存放使用者輸入的地址單元

mov bx,3

;下面的程式段是將使用者輸入的4個字元轉換成4位數(十六進位制)

;total = 千位的數字*1000+百位的數字*100+十位的數字*10+個

mov mulnumber,1;乘數

mov cl,buf+1

next:xor ax,ax

mov al,[si+bx];與使用者輸入的4位數的個位數

sub al,30h;因為字元數字的ascii碼是以30h+數字,所以數字=ascii - 30h

mul mulnumber;因為4位數不超過65535,所以我們不用裡dx中的值,因為只有乘出來的積列印65535,dx才會有變化

add number[di],ax;將積和total相加

xor ax,ax;ax清零

mov al,10

mul mulnumber

mov mulnumber,ax;乘數*10

dec bx;指向高一位

loop next

add di,2;指向number的下一個字單元

pop cx;恢復原來的cx的值

loop input;迴圈輸入

;接下來就是排序了

;這裡我們用氣泡排序,升序

;氣泡排序的思想是:從第一個元素開始,依次對n個元素中相鄰的兩個元素進行比較

;若順序不滿足則交換,經過一輪後,最大的元素就排到了最右邊.後面依次類推

mov cx,count

dec cx

mov di,0;最右邊有多少個元素,一開始是0個

sequ1:push cx

mov bx,0

mov cx,count

sub cx,di

sequ2:mov ax,number[bx];前一個元素

cmp ax,number[bx+2];後一個元素

jb sequ3;如果前一個元素小於後一個元素,就不要交換了

;以下4句是交換number[bx+2]和number[bx]地址的值

xchg ax,number[bx+2]

mov dx,number[bx]

mov number[bx+2],dx

mov number[bx],ax

sequ3:add bx,2

loop sequ2

inc di;右邊有一個最大元素,di+1

pop cx

loop sequ1

;下面是將排好序的數顯示出來

lea si,number

mov bx,0

mov cx,count

display:

push cx;儲存cx的值

mov cx,10

xor dx,dx

mov ax,number[bx]

dis1:div cx

push dx;儲存餘數

xor dx,dx;dx清零,因為做字除法的時候,(dx,ax)都會參與運算,在這裡我們只需要ax運算,如果有dx運算的話,那麼結果會出錯

and ax,ax;測試al(商是否為0)

jnz dis1;如果不是0,說明沒有除盡,繼續迴圈

;輸出回車,換行

lea dx,crlf

mov ah,9

int 21h

;現在棧裡的元素是5個cx,dx,dx,dx,dx,而dx從左到有時個位,十位,百位,千位

;所以現在我們倒著輸出,就可以得到千,百,十,個

mov cl,4;四位數

dis2:pop dx

add dl,30h

mov ah,2

int 21h

loop dis2

add bx,2;下一個元素

pop cx

loop display

mov ax,4c00h

int 21h

code ends

end start

結果圖:

上面還有資料沒有顯示,視窗限制沒有辦法

2樓:匿名使用者

data segment ;資料段,都這麼寫

len equ 10 ;變數len=10

array dw 10 dup(?) ;定義10個dw字型別的變數,成為一個陣列array

mess db 0dh,0ah,'please input numbers',0dh,0ah,'input:$';db位元組型別的變數mess,0dh,0ah控制回車,'please input numbers'用來顯示,0dh,0ah再回車,顯示'input:',$表示字串內容結束

enter db 0dh,0ah,'$';enter表示回車

sy db 0dh,0ah,'sort end output data :','$';回車,列印'sort end output data :,$作用同上

number db 5,0,5 dup(?); 同上

change db 0 ;變數change=0

data ends ;資料段結束

stack segment stack ;這是堆疊段,老師不會讓你講它,固定格式

sta db 64 dup(0)

stack_top db 0

stack ends

code segment;**段

assume cs:code, ds:data , ss:stack;這裡也是固定的,不會問

太尼瑪長了 我放棄咯 囧、、、

3樓:希伯來爵

data segment

len equ 10

//定義巨集 len=10

array dw 10 dup(?)

//定義word型陣列 array[10]

mess db 0dh,0ah,'please input numbers',0dh,0ah,'input:$'

//定義字串mess="\r\nplease input numbers\r\ninput:"

enter db 0dh,0ah,'$'

//定義回車符enter="\r\n"

sy db 0dh,0ah,'sort end output data :','$'

//定義字串sy="\r\nsort end output data :"

number db 5,0,5 dup(?)

//定義byte型陣列number=

change db 0

//定義byte型變數change=0

data ends

stack segment stack

sta db 64 dup(0)

stack_top db 0

stack ends

//堆疊空間64+1=65byte,stack_top為棧頂

//不過好像程式裡沒有用到堆疊操作

code segment

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

start: mov ax, data

mov ds, ax

mov ax,stack

mov ss,ax

//段暫存器初始化

lea sp, stack_top

//堆疊指標初始化

mov bx, offset array

//把array的偏移地址賦給bx

//即bx指向array[0]

mov cx,len

設定迴圈次數10次

a :mov ah,09h

lea dx,mess

int 21h

//螢幕顯示字串mess的內容

lea dx,number

mov ah,0ah

int 21h

//從鍵盤輸入東西到number

lea di,number

//di指向number[0]

mov dl,[di+2]

//dl等於number[2]

sub dl,30h

//dl=dl-30h

//(說明:30h就是'0',這個操作把字元轉換成數字,例如'1'->1)

mov ah,dl

shl ah,01

shl ah,01

shl ah,01

shl ah,01

//ah=dl*16

mov dl,[di+3]

//dl=number[3]

sub dl,30h

//轉換

add ah,dl

//ah=ah+dl

mov dl,[di+4]

//dl=number[4]

sub dl,30h

//轉換

mov al,dl

shl al,01

shl al,01

shl al,01

shl al,01

//al=dl*16

mov dl,[di+5]

//dl=number[5]

sub dl,30h

//轉換

add al,dl

//al=al+dl

mov [bx],ax

//array[0]=ax

add bx,02

//bx=bx+2,即bx現在指向array[1]的地址

loop a

//迴圈

sort: mov bx, offset array

//bx指向array[0]

mov cx,len-1

//設定迴圈次數9次

mov change, 0

//初始化change=0

goon: mov ax,[bx]

//ax=array[0]

add bx,2

//bx指向array[1]

cmp ax,[bx]

//array[0]和array[1]比較大小

jb next

//如果array[0]>array[1]則不進行處理,繼續下一步

mov change, 1

//否則的話 change=1 並執行下面的**

xchg ax, [bx]

mov [bx-2], ax

//交換array[0]和array[1]

//處理結束,下一步

next: loop goon

//迴圈

cmp change, 0

//change和0比較大小

jne sort

//如果change不等於0,則繼續sort

//sort第一次把最小的數放在了最後

//sort第二次把第二小的數放在了倒數第二的位置,以此類推

mov cx,len

//設定迴圈次數10次

//排序結束,下面開始輸出

lea si,array

//si指向array[0]

mov ah,09h

lea dx,sy

int 21h

//螢幕顯示字串sy的內容

b :mov ah,09h

lea dx,enter

int 21h

//螢幕輸出一個回車

mov bx,[si]

//bx=array[0]

mov dh,bh

//dh=bh

and bh,0f0h

//bh的低四位清零

shr bh,1

shr bh,1

shr bh,1

shr bh,1

//bh高四位轉移到低四位

add bh,30h

//bh=bh+30h

//這個操作把數字轉換成字元

mov dl,bh

mov ah,02

int 21h

//輸出bh,即array[0]的最高位

and dh,0fh

add dh,30h

mov dl,dh

mov ah,02

int 21h

//輸出array[0]的次高位

mov dh,bl

and bl,0f0h

shr bl,01

shr bl,01

shr bl,01

shr bl,01

add bl,30h

mov dl,bl

mov ah,02

int 21h

and dh,0fh

add dh,30h

mov dl,dh

mov ah,02

int 21h

//輸出array[0]的後兩位

add si,2

//si指向array[1]

loop b

//迴圈

mov ax,4c00h

int 21h

//程式結束

code ends

end start

組合語言一道習題大家幫忙看看對不對

資料段定義錯誤 可如下定義 dseg segment xx dw 10 yy dw 0 dseg ends 或dseg segment xx dw x yy dw y x equ 10 y equ 0 dseg ends 組合語言 一道習題 灬 灬銘 對的。對於ax dx的,餘數在dx商在ax mo...

和組合語言有關的問題,關於組合語言的一個問題

bx為例,其實體地址 ds 16 bx。但你算這個值沒什麼用,因為所有的暫存器都是16位的,放不下這麼大的值。樓上關於 段是若干棟樓,偏移量是門牌號 的比喻不太準確,因為一個實體地址可以由不同的段址 偏移量組合來訪問。建議這樣來理解,記憶體是一條長長的直路,偏移量是眼睛的視力範圍,太遠就看不見了。而...

一道c語言程式設計題目

c,靜態變數在整個程式執行過程中都存在。首先呼叫fun a fun d 中的fun d 這裡的d是外部變數d即值為1,所以在被呼叫函式裡p值就為1 進入函式fun後外部變數d被遮蔽,靜態變數d起作用,d p使d變為6,所以第一個輸出的數是6 然後函式fun返回數字6,這樣a fun d 為9,再次呼...