組合語言求無符號位元組序列中的最大值和最小值

時間 2021-08-30 10:55:19

1樓:吳勇一家人

stack1 segment stack

dw 64 dup(?)

stack1 ends

code segment

assume cs:code

start: mov si,3000h

mov cx,0008h

call branch

int 03h

branch: jcxz a4

push si

push cx

push bx

mov bh,[si]

mov bl,bh

a1: lodsb

cmp al,bh

jbe a2

mov bh,al

jmp a3

a2: cmp al,bl

jae a3

mov bl,al

a3: loop a1

mov ax,bx

pop bx

pop cx

pop si

a4: ret

code ends

end start

2樓:匿名使用者

參考思路如下:

首先對若個數按從小到大排序,然後第一個元素就是最小的,最後一個元素就是最大的 ;

參考**如下:

data segment

mes1 db 'the max:$'

mes2 db 'the min:$'

a dw 42,20,100,456,99,120,89,12334,90,1239

data ends

code segment

main proc far

assume cs:code,ds:datastart:

push ds

sub ax,ax

push ax

mov ax,data

mov ds,ax

;以下是起泡排序核心**

mov cx,10

dec cx

loop1:

mov di,cx

mov bx,0

loop2:

mov ax,a[bx]

cmp a[bx+2],ax

jge cotinue

xchg ax,a[bx+2]

mov a[bx],ax

cotinue:

add bx,2

loop loop2

mov cx,di

loop loop1

mov dx,offset mes1

mov ah,09h

int 21h

call crlf

mov bx,a[18]

call bini ;轉換為十進位制的子程式call crlf ;回車換行子程式

mov dx,offset mes2

mov ah,09h

int 21h

call crlf

mov bx,a[0]

call bini

retmain endp

bini proc near

mov cx,10000d

call bin

mov cx,1000d

call bin

mov cx,100d

call bin

mov cx,10d

call bin

mov cx,1d

call bin

retbini endp

bin proc near

mov ax,bx

mov dx,0

div cx

mov bx,dx

mov dl,al

add dl,30h

mov ah,02h

int 21h

retbin endp

crlf proc near

mov dl,0ah

mov ah,02h

int 21h

mov dl,0dh

mov ah,02h

int 21

retcrlf endp

code ends

end start

3樓:匿名使用者

datas segment

s db '1234567890'

s1 db 'max: '

max db 0,'$'

s2 db 'min: '

min db 0,'$'

datas ends

codes segment

assume cs:codes,ds:datas

start:

mov ax,datas

mov ds,ax

mov si,offset s ;初始化si,cx

mov cx,9 ;cx為定義的個數減一

mov bh,[si] ;第一個字元放入bh,bl

mov bl,bh

ss1: ;開始比較

inc si

mov al,[si]

cmp al,bh

jb ss2

mov bh,al ;al>bh 寫入bh

jmp ss3

ss2:

cmp al,bl

ja ss3

mov bl,al ;al

ss3:

loop ss1

mov max,bh ;寫入最大值

mov min,bl ;寫入最小值

mov dx,offset s1 ;顯示最大值

mov ah,9

int 21h

mov dl,' ' ;顯示空格

mov ah,2

int 21h

mov dx,offset s2 ;顯示最小值

mov ah,9

int 21h

mov ah,0 ;等待鍵盤輸入

int 16h

mov ah,4ch

int 21h

codes ends

end start

4樓:做而論道

;從鍵盤接收任意字元。

assume cs:code, ds:data

data segment

msg1 db 'please input some chars: $'

msg2 db 13, 10, 'the biggest char is: <'

big db ' ', '>'

db 13, 10, 'the smallest char is: <'

min db 127, '>$'

nnn db 0

data ends

code segment

start:

mov ax, data

mov ds, ax

;------------------------------

mov dx, offset msg1

mov ah, 9

int 21h

m_loop:

mov ah, 1

int 21h

cmp al, 13

je disp

inc nnn

cmp al, ds:[big]

jb next

mov ds:[big], al

next:

cmp al, ds:[min]

jnb m_loop

mov ds:[min], al

jmp m_loop

disp:

cmp nnn, 0 ;輸入 0 個嗎 ?

je exit ;是則退出,不予顯示

mov dx, offset msg2

mov ah, 9

int 21h

;------------------------------

exit:

mov ah, 4ch

int 21h

code ends

end start

本程式執行後,顯示如下:

please input some chars: 1357924680

the biggest char is: <9>

the smallest char is: <0>

本程式,沒有使用 bh、bl,而是使用了儲存器變數 big、min。

效果是相同的。

因為,bh 等8位的暫存器,僅僅有八個,經常不夠用。

儲存器變數,則可以定義 65535 個。

這樣,程式就更有通用性。

微機組合語言三道小題,求高手解答

5樓:匿名使用者

1.assume cs:code, ds:data

data segment

buf1 db 12,45,98,7,5,-3,6,-2,9,4,4,5,8,4,21,2,45,12,5,4,3,5,75,2,1,5,7,-1

data ends

code segment

start:

mov ax, data

mov ds, ax

mov es,ax

lea di, buf1

mov cx, 65535

mov al,-1

cldrepne scasb ;但al-(di) == 0, 即al = (di)是跳出迴圈, 或者cx=0時, 跳出迴圈, 所以當(di)=-1時, 跳出迴圈

;如果(di)不等於-1,那麼cx-1,繼續迴圈。直到(di) = -1, 或cx = 0

mov ax, 65535

sub ax, cx ;現在cx的值是65535-字串的長度, 那麼65535-(65535-字串的長度) = 字串的長度

mov cx,ax

mov ax, 4c00h

int 21h

code ends

end start

2.assume cs:code

code segment

start:

xor byte ptr ds:[0500h], 11110000b ;0500h單元有一個數

;異或有一個特點,就是任何位與1異或,取反,與0異或,不變

;所以高4位置1取反, 低4位置0不變

mov ax, 4c00h

int 21h

code ends

end start

3.;編寫子程式。求記憶體中一無符號位元組型資料序列的最大值和最小值。

;該無符號位元組型資料序列的起始地址位於si中,

;資料個數位於cx中。要求求得的最大值存放於ah中,最小值存放於al中。主程式呼叫子程式實現上述功能。

assume cs:code, ds:data

data segment

num db 12,45,0,98,12,255,45,12,36,88,54,12,36 ;最大值為255(ff), 最小值為0(0)

count db $-num

data ends

code segment

start:

mov ax, data

mov ds,ax

mov cl, count ;資料個數位於cx中

mov si, offset num ;該無符號位元組型資料序列的起始地址位於si中

mov al, [si]; ;假設最小值現在在al中

mov ah, al; ;假設最大值現在在al中

inc si

lp: cmp al, [si]

jb done ;如果al小於[di]的話,那麼al還是最小值, 不需要改變

mov al, [si] ;否則[di]中就是最小值,那麼將他賦值給al

done: cmp ah, [si]

ja done1 ;如果ah大於[di], 那麼不需要改變, 還是最大值

mov ah,[si] ;否則[di]中就是最大值,那麼將他賦值給al

done1: inc si

loop lp

mov ax,4c00h

int 21h

code ends

end start

源**檔案中的**是排好版的

ps:若有不明白的地方,可以追問

組合語言中mov ds,ax移動的是ax中的資料還是隻是它的複製

念憶 對計算機而言,移動即是複製。移動一個檔案到其它地方,也是先複製過去,再把原檔案刪除。mov ds,ax 將ax中的資料賦值給ds,ax中的值不會消失。mov ax,data這句,如果是前面有assume ds data的情況,是將地址值傳給ax。由於彙編指令系統龐大,因而需構建指令系統體系,其...

怎麼理解彙編中的立即數,組合語言中 立即數 究竟是個什麼東東,時而可以代表

海獅 一樓的第一句是正確 cpu要找的資料就在命令中,是指令的一部分,比如mov al,0fh下面的措辭不當 它與 一起存於 段,這樣的資料稱為立即數,或者直接運算元。應當改為 立即數本身是 的一部分,在 段中可以找到。立即數的限制很多,而且速度很慢,不是很推薦。例如 mov ax,0 往往寫成 x...

組合語言中的基本資料型別與高階語言程式設計中的資料型別的對應關係是什麼

常用的型別對照如下 彙編 c語言 佔位元組數 db char 1 dw short int 2 dd int 或float 4 dq long int 或 double 8 組合語言的基本資料型別有哪些?與高階程式 如c 的資料型別的對應關係是什麼?請通俗解釋,謝謝 因為組合語言直接面向硬體進行操作...