彙編複習Test5

2021-08-02 08:52:04 字數 3603 閱讀 9353

1.編乙個程式,從鍵盤輸入乙個不長於120個字元的串(回車鍵結束),然後將其中的字母字元顯示輸出(在顯示輸出前,補充輸出回車換行)。

datas segment

buf db 120 dup(?)

datas ends

stacks segment

;此處輸入堆疊段**

stacks ends

codes segment

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

start:

mov ax,datas

mov ds,ax

mov si,offset buf

ag: mov ah,01h

int21h cmp al,0dh

je exit

mov [si],al

inc si

jmp ag

exit:

mov [si],al

mov ah,02h

mov si,offset buf

ag1:

mov dl,[si]

int21h cmp al,0dh

je exit1

inc si

jmp ag1

exit1:

mov ah,4ch

int21hcodes ends

end start

2.編乙個程式完成從鍵盤上輸入乙個4位的16進製制數,並以八進位制形式顯示出來。

datas segment

num dw 1000h,100h,10h,1h

datas ends

stacks segment

;此處輸入堆疊段**

stacks ends

codes segment

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

start:

mov ax,datas

mov ds,ax

mov si,offset num

mov cx,4

mov bp,0

input:

mov ah,01h

int21h cmp al,39h

jbe less

sub al,7h

less:

sub al,30h

mov ah,0

mov bx,[si]

mul bx

add bp,ax

add si,2

loop input

rol bp,1

mov dx,bp

and dl,01h

add dl,30h

mov ah,02h

int21h mov cx,5

output:

push cx

mov cl,3

rol bp,cl

mov dx,bp

and dl,07h

add dl,30h

mov ah,02h

int21h pop cx

loop output

mov ah,4ch

int21hcodes ends

end start

3. 在首位址為data的字陣列中,存放了100h個16位無符號數,編乙個子程式,找出其中的最小數,並存入ax暫存器中返回。

4. 已知資料塊buf中存放3個位元組資料,是編寫乙個程式判斷這3個數的關係:如果3個數相等,則顯示「all equal.」;如果有任意兩個數相等,則顯示「only two equal.」;如果三個數各不相同,則顯示「all three different from each other.」。

data segment

buf db 1,2,3 ;三個資料

disp1 db 'all equal$'

disp2 db 'only two equal$'

disp3 db 'all three diffrent from each other$'

data ends

code segment

assume cs:code,ds:data

main proc far

start:mov ax,data

mov ds,ax

mov si,offset buf ;位址指標

mov ax,[si]

cmp ax,[si+2] ;第乙個數比第二個數

jnz l1 ;1,2不相等則跳轉

cmp ax,[si+4] ;接上面,1,2相等的話比較1,3

jnz l2

lea dx,disp1 ;不相等則跳轉,顯示兩個相等

call print1 ;否則全相等,呼叫子程式顯示

jmp quit

l1:cmp ax,[si+4] ;此處是在1,2不相等的條件下比較1,3

jz l2 ;相等的話即有兩個相等跳轉至l2(顯示disp2)

mov ax,[si+2]

cmp ax,[si+4] ;1,3不相等,1,2不相等,比較2,3

jz l2

lea dx,disp3 ;2,3相等的話也是兩個相等,同樣跳轉至l2

call print1 ;否則沒有相等的,呼叫子程式顯示disp3

jmp quit

l2: lea dx,disp2

call print1

quit:mov ax,4c00h

int21hmain endp

;;子程式部分

print1 proc

mov ah,09h

int21h ;呼叫功能顯示都相等

retprint1 endp

code ends

end start

5.link指向乙個字線性表,其中的首單元儲存線性表的長度,編乙個程式,將該線性表中元素的值為負數的項刪除。

datas segment

link dw -9h,3h,33h,2h,1h,-77h,22h,23h,33h

finial dw ($-link)/type link

datas ends

stacks segment

stacks ends

codes segment

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

start:

mov ax,datas

mov ds,ax

lea si,link

mov cx,finial

ag: mov ax,[si]

cmp ax,0

jge exit

dec cx

push cx

mov di,si

delete:

mov ax,[di+2]

mov [di],ax

add di,2

loop delete

pop cx

exit:

add si,2

loop ag

mov ah,4ch

int21hcodes ends

end start

演算法 test5 最近對問題

設s是平面上n 1個點構成的集合,假設集合中的每個點都不一樣,最近對問題就是找出集合s中距離最近的點對。當n大於等於2小於等於3時,問題可以通過蠻力演算法求解 當n大於3時,可以將集合分成兩個子集s1和s2,然後通過遞迴求解子問題s1和s2來得到最近對問題的解。輸入 按x座標公升序排列的n n 1 ...

彙編test和cmp區別

看過破解教程,都知道test,cmp是比較關鍵,可是我一直不清楚它們究竟是怎麼比較的,最後下決心找了很多資料,和大家一起把它們弄清楚.首先看看 狀態暫存器 即標誌暫存器 psw program flag 程式狀態字 即標誌 暫存器,是乙個16位暫存器,由條件碼標誌 flag 和控制標誌構成,如下所示...

彙編中的test和cmp指令

看過破解教程,都知道test,cmp是比較關鍵,來分析一下它們究竟是怎麼比較 首先看看 狀態暫存器 即標誌暫存器 psw program flag 程式狀態字 即標誌 暫存器,是乙個16位暫存器,由條件碼標誌 flag 和控制標誌構成,如下所示 條件碼 of overflow flag 溢位標誌,溢...