簡體   English   中英

68K中的大小寫

[英]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個十六進制數字是從015值,而這恰好是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM