2017-01-20 253 views
0

我想從大寫轉換爲小寫。 這是我編寫的代碼,但仍然沒有得到錯誤在哪裏。我知道從上到下隱蔽我已經減去32,以便嘗試去做它。但是,在我運行該程序後,它不會以小寫顯示結果。 感謝您的幫助。68K中的大寫字母小寫

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 
+1

使用位掩碼可能會好得多。當除了大寫字符之外還有其他內容時,減法32可能會出現意想不到的行爲......就像小寫字母。 –

+2

這是32位十進制數,而不是十六進制 - 重複4次的十進制數本質上將減去一個隨機數。使用十六進制附:要從大寫變成更小,您需要添加不減。 –

+0

@大衛Hoelzer:謝謝,你是什麼意思的位掩碼,對不起我是新的程序員在68K – nas2016

回答

1

#32323232 ...嗯,那個,價值32323232。但是您試圖將它應用到4個BYTE字符,並將其加載爲32位(LONG)值,這意味着每個字符佔用它自己的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的功率,可以將十進制值放在特別是BYTE的LONG中。因此,例如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次冪的倍數,取決於它在數字中的位置。 IE瀏覽器。值爲123的十進制格式(基數10)格式化爲「123」,其中「1」表示值的數量爲10 「2」表示10 「3」表示10 值。

請注意,書面的「123」表格不是編號123。數字123是純粹的抽象實體,用於在這裏寫下來的十進制格式如「123」實際上是數值本身的不完美鏡像,對此格式的十進制格式強加的限制很少,而不是實際值。可能是「基本N」格式的這些缺陷的最簡單示例:值123具有十進制秒有效形式:122.99999..具有無限量的「9」分數。它仍然是完全相同的值123,但寫法不同(並且不像實際上那樣,有限短的「123」變體)。

所以回到你的32323232 ......你確實想把每個32放在特定的BYTE中,但是這需要你使用32*256*256*256 + 32*256*256 + 32*256 + 32 = 538976288十進制值。哪個是PITA要計算的頭。

如果你想知道「爲什麼彙編源程序充滿了那些煩人的十六進制數?」,這裏就是這個冗長的答案和所有這些數字練習的要點。

32$20(你應該能夠在你的腦海中迅速轉換兩個冪)。如果你想在特定的字節位置放置$20,你必須編寫#$20202020(當然它仍然是538976288)。沒有計算器,這當然是可以管理的,而在寫源代碼的時候,對吧?所以這就是答案,爲什麼十六進制格式在彙編程序員中非常流行,它允許您立即看到什麼是字/長值的特定字節值。

只是爲了好奇,你的32323232值分裂成$01ED36A0(你現在可以看到它們嗎?每個字節是8位=兩個4位,4位=單個十六進制數字)的字節。


而且,馬克指出,您需要添加。所以,解決您的源:

 MOVE.L USERID,D0 
     ADDI.L #$20202020,D0 
     MOVE.L D0,result 

這確實會顯示在地址result$101E)在內存中 「ABCD」。


關於"bit manipulation":如果你看看用十六進制格式的ASCII表,你會看到大/小寫字母有除第6位,這是明顯的大寫字母相同的值,並設置爲小寫。

所以通過這樣做ORI.L #$20202020,D0您將設置每個字節的第6位打包在D0長,有效地爲字母ASCII值「小寫」。

ANDI.L #~$20202020,D0~$20202020$DFDFDFDF,反轉$20位模式)將對ASCII字母做「大寫」。

XORI.L #$20202020,D0對於ASCII字母,會將上部翻到下部和下部到大寫。

所有這些將毫無意義地破壞其他ASCII字符,如數字和符號,所以這些位技巧只有當你知道你的值只包含字母時纔可用(「垃圾進入,垃​​圾出」)。

+0

非常感謝你的工作,並且我從你所解釋的內容中瞭解得更多 – nas2016