[英]upper to lower case in 68K
我想從大寫轉換為小寫。 這是我編寫的代碼,但仍然無法得到錯誤所在。 我知道從上到下隱蔽地我要減去32,以便嘗試這樣做。 但是,運行程序后,它不會以小寫形式顯示結果。 謝謝你的幫助。
START ORG $1000
MOVE.L USERID,D0
SUBI.L #32323232,D0
MOVE.L D0,result
SIMHALT
USERID DC.L 'ABCD1234'
result DS.L 1
END START
#32323232
是...嗯,值32323232
。 但是您嘗試將其應用於以32位(LONG)值加載的4個BYTE字符,這意味着每個字符都占用了它自己的8位,例如在MOVE.L USERID,D0
之后D0
是$41424344
,其中$41 == 65 == 'A', $42 == 66 == 'B', $43 == 67 == 'C', $44 == 68 == 'D'
。
在十六進制格式中,每個字母(8位)正好有兩個十六進制數字,因為1個十六進制數字是從0
到15
值,而這恰好是4位總共可以編碼的值,因此它是4位<=> 1個十六進制數字的完美轉換。
但是,如果您使用該值$41424344
並將其從十六進制轉換為十進制,則會得到1094861636
。 它仍然是相同的值,但是突然之間字母變得不容易在其中“可見”。 它們被隱藏為65*256*256*256 + 66*256*256 + 67*256 + 68 = 1094861636
,因為8位可以編碼256
不同的值,因此通過乘以256
的冪可以特別設置十進制值LONG的BYTE。 因此,例如66*256*256
表示“長整數的第三個最低有效字節”,或者從技術上講,它意味着將十進制值66
“左移16位”。 實際上,如果將66
裝入D1
並執行LSL.L #16,D1
,則無需使用乘法指令就可以計算出66*256*256 == 66*65536 == (66<<16)
。
關於數字“以N為底的格式”是如何工作的,您擁有M個數字(從0到N-1),每個數字代表N的i次冪的倍數,具體取決於數字在數字中的位置。 就是 十進制(以10為基數)格式的值123
被寫為“ 123”,其中“ 1”代表10 2的值量,“ 2”代表10 1的值 ,“ 3”代表10 0的值。
請注意,書面的“ 123”格式不是123
。 數字123
純粹是抽象的實體,用於在此處寫下它的十進制格式(如“ 123”)實際上是值本身的不完美鏡像,十進制格式對此格式(而不是對實際值)施加的限制很少。 可能是“基數N”格式的這些不完美之處的最簡單示例:值123
以十進制秒的有效形式表示: 122.99999..
具有無限數量的“ 9”分數。 確切地來說,它仍然是相同的值123
,但是寫的方式不同(實際上不像有限短的“ 123”變體那樣)。
回到32323232
...您確實想將每個32
放在LONG中的特定BYTE上,但這將要求您使用32*256*256*256 + 32*256*256 + 32*256 + 32 = 538976288
十進制值。 首先要計算的是PITA。
如果您想知道“為什么匯編源中充滿了那些煩人的十六進制數字?” ,這是冗長的答案和所有這些數字練習的重點。
32
是$20
(您應該可以即時轉換兩個冪)。 而且,如果要將$20
放在特定的字節位置,則必須編寫#$20202020
(當然還是538976288
)。 不用計算器,寫源代碼當然可以解決,對嗎? 因此,這就是答案,為什么十六進制格式在Assembly程序員中如此流行,它使您可以立即查看word / long值中特定字節的值是什么。
出於好奇,您的32323232
值會拆分為$01ED36A0
字節(您現在可以看到它們嗎?每個字節為8位=兩個4位,而4位=單個十六進制數字)。
並且如Mark所述,您需要添加。 因此,請修復您的來源:
MOVE.L USERID,D0
ADDI.L #$20202020,D0
MOVE.L D0,result
這確實會在地址result
( $101E
)的內存中顯示“ abcd”。
關於“位操作” :如果您看一下采用十六進制格式的ASCII表,您將看到大寫/小寫字母具有相同的值,但第6位除外(第6位可用於大寫字母,而可設置為小寫)。
因此,通過執行ORI.L #$20202020,D0
您將在D0
長的每個字節中設置第6位,有效地對字母ASCII值執行“小寫”操作。
ANDI.L #~$20202020,D0
( ~$20202020
是$DFDFDFDF
,倒置的$20
位模式)將對ASCII字母“大寫”。
XORI.L #$20202020,D0
將上下翻轉,並降低到大寫,以表示ASCII字母。
所有這些都將無意義地破壞其他ASCII字符,例如數字和符號,因此,僅當您知道您的值僅包含字母( “垃圾回收,垃圾回收” )時,這些位技巧才可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.