我無法使用 DOS Debug 完成給定的任務:
每個輸入的字串符號,具有偶數位數的位必須更改為 0。然后字串必須反轉并列印到螢屏上。
a200
db 50
a260
db 'Enter string' 0d 0a '$'
a100
mov ah, 09
mov dx, 260
int 21
mov ah, 0a
mov dx, 200
int 21
mov ah, 02
mov dl, 0d
int 21
mov ah, 02
mov dl, 0a
int 21
xor cx, cx
mov bx, 201
mov cl, [bx]
int bx
mov dl, [bx]
inc bx
mov dl, [bx]
mov al, dl
mov ah, 0
clc
rcr al, 1
adc ah, 0
這就是我能走多遠。然而,它還沒有完成。我不確定我是否朝著正確的方向前進。
我有一個想法使用 perity 標志來檢查位數是否是偶數。但是,我無法實作它。
uj5u.com熱心網友回復:
int bx mov dl, [bx] inc bx mov dl, [bx] mov al, dl mov ah, 0 clc rcr al, 1 adc ah, 0
在讀取用戶輸入字串的長度之前,您的代碼看起來不錯,但隨后開始看起來您只是將一些隨機的東西放在一起!
您使用奇偶校驗標志的想法是可以的。當一個位元組有 0、2、4、6 或 8 位被設定(為 1)時,PF 將被設定。當一個位元組有 1、3、5 或 7 位設定(為 1)時,PF 將被清除。
x86 指令集有 4 條指令,允許您根據奇偶校驗標志的狀態有條件地跳轉:
和jp指令jpe共享相同的操作碼 7Ah。
jp奇偶校驗時跳轉 (PF=1)jpe偶校驗時跳轉 (PF=1)
jnp和指令共享相同的jpo操作碼 7Bh。
jnp如果沒有奇偶校驗則跳轉 (PF=0)jpo如果奇偶校驗 (PF=0) 則跳轉
有許多指令可以修改奇偶校驗標志。下面的代碼使用該cmp指令。在您的程式中,您希望在奇偶校驗的情況下歸零,這相當于在沒有奇偶校驗的情況下跳過歸零。這就是代碼使用jnp指令的原因。
...
011F mov cl, [bx]
0121 mov bx, 202 ; Where the string starts
0124 cmp byte ptr [bx], 0 ; Have the parity flag defined
0127 jnp 012C ; Skip in case of no parity
0129 mov byte ptr [bx], 0 ; Zero in case of parity
012C inc bx ; Go to next character
012D loop 0124 ; Until all characters have been processed
在上述回圈結束時,BX 暫存器指向字串的正后方。這是應用 $-terminator 列印最終結果所需的好時機。
012F mov byte ptr [bx], "$"
反轉字串的任務需要維護兩個在交換位元組時相互移動的指標:
0132 dec bx ; Have BX point at the last byte in the string
0133 mov si, 202 ; Have SI point at the first byte in the string
0136 mov al, [bx] ; Read both bytes
0138 mov dl, [si]
013A mov [bx], dl ; Swap both bytes
013C mov [si], al
013E inc si ; Move towards the middle of the string
013F dec bx
0140 cmp si, bx ; Stop once the pointers cross
0142 jb 0136
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516567.html
標籤:部件x86-16平价
上一篇:逆向工程C目標檔案
下一篇:三角形Kotlin的斜邊
