在 adr 開始的連續單元,存放三個16位無符號數 a,b,c。
資料定義:
adr dw 3257h, 5891h, 0b24h
flag db ?
要求:若a、b、c同時為偶數,將 flag 單元設定為1;
若同時為奇數,將 flag 單元置0;
否則flag單元置全1。
編制匯程式設計序完成上述操作。
---------------------------
分析:題目的要求,可以寫成下面的形式。
--全為偶,flag置1
--全為奇,flag置0
--奇偶皆有則flag單元置全1
如果這個序列都是奇數,就必須全部資料都檢測一遍,才能確定它們全部都是奇數;
如果這個序列都是偶數,也是必須把全部資料都檢測一遍。
但是,判斷序列中,是不是也有奇數、也有偶數,這可就簡單了。
比如,把第乙個數,判斷出來了,它是奇數,判斷第二個數時,如果發現它是偶數,
那麼,奇偶都存在的結論,這就已經出來了。還有必要繼續判斷嗎?
這就是說,判斷
奇、偶
都存在,就很簡單
,很有可能
提前結
束程式。不需要把全部資料都檢測一遍。
做而論道就是按照這個思路,編寫了如下的程式。
datas segment
; adr dw 3257h, 5891h, 0b24h
adr dw 325ch, 5890h, 0b24h
flag db ?
datas ends
codes segment
assume cs:codes, ds:datas
start:
mov ax, datas
mov ds, ax
mov flag, 0ffh ;先假設奇偶皆有
test word ptr [adr], 1
jne qi1
;-----------------------------
ou1:
test word ptr [adr + 2], 1
je ou2
jmp exit
ou2:
test word ptr [adr + 4], 1
je ou3
jmp exit
;-----------------------------
qi1:
test word ptr [adr + 2], 1
jne qi2
jmp exit
qi2:
test word ptr [adr + 4], 1
jne qi3
jmp exit
;-----------------------------
ou3:
inc flag
qi3:
inc flag
exit:
mov ah, 4ch
int 21h
codes ends
end start
程式中,首先判斷第乙個數字的奇偶性,為奇則轉移,轉移到 qi1 後,再繼續檢測後面的資料。
一旦發現檢測到了偶數,就立即跳到結束程式的位置。
如果第乙個數字是偶數,那麼後面就連續檢測資料都是否為奇數,為奇數則轉到結束。
如果都是奇數(或都是偶數),那就乙個乙個檢測吧,把全部資料都檢測一遍,全奇(全偶)的結論也就出來了。
當得出結論後,對 flag 賦值時,做而論道寫的也相當的簡單,用了兩條加一的指令,就代替了傳送資料再轉移的寫法。
-----------------------------
做而論道的程式設計思路雖然比較好,但是提問者並沒有理解。
他選擇了乙個「全部檢測」的程式。
這個程式,確實,也是正確的。
它可以檢測資料的奇偶個數的特點,也可以給 flag 正確的賦值。
但是,它把資料全部檢測了一遍,把其中的偶數個數得出來了。
然後,再把這個偶數的個數和總數比較,如果相同,那就是說:全都是偶數。
否則,再判斷這個偶數的個數,是 0 嗎?如果是,那就是說:全都是奇數。
再否則,就是奇偶都有。
-----------------------------
80x86組合語言 分類統計
組合語言的程式設計題!急 有100個學生成績,存放在以data為首址的位元組儲存單元中。試統計其中90 含90 以上的人數,60 90 含60 之間的人數,60以下的人數,分別存入max,middle,min三個變數中。15 分鐘前 做而論道 十七級 最快回答 assume ds qq,cs cc ...
組合語言 80x86定址方式
1 立即定址方式 立即定址方式中指令的運算元是8位或16位立即數,並直接出現在指令中。例如 mov al,10h 源運算元為立即定址 執行後al 10h mov ax,0a48h 源運算元為立即定址 執行後ax 0a48h 立即定址只能用於源運算元,不能用於目的運算元。2 暫存器定址方式 暫存器定址...
80x86組合語言程式設計P50
386 stack segment use32 db 200 dup 0 stack ends con equ 500 data segment use16 a dw m buf db ab 0dh,0ah b dw 0ffaah d dd buf m db 2 dup 1 2 dup 2,b 12...