汇编大小写转换问题
1.大小寫轉換問題
小寫字母的ASCII碼值比大寫字母的ASCII碼值大20H
A 16進制 41? 二進制01000001
a 16進制 61? 二進制01100001
B 16進制 42? 二進制01000010
b 16進制 62? 二進制01100010
可以發現一個很特別的地方就是
小寫字母第5位總是1,對應的大寫字母第5位總是0
所以在進行字母轉換的時候,比如要將小寫字母a轉換成大寫字母,只要將
其a對應的二進制第5位設置為0
要將大寫字母A轉換成小寫字母a 的時候只要將第5位的0設置為1
注意:參照上面的可以發現每個字符對應一個16進制,所以
可以這樣定義字符串
db 'BaSic'
db 'iNfOrMaTiOn'
完整的程序如下
datasg segment
?? ?db 'BaSic'
?? ?db 'iNfOrMaTiOn'
datasg ends
codesg segment
?? ?start:
?? ?codesg ends
end start
用cmd運行了,但是在內存中沒發現字符串被載入了,為啥呢?
對于下面的例子的理解
a[i]=a[i]&0xDF;
&按位與,就是將符號兩邊的都先化為二進制,再進行與運算
0xDF化為二進制為11011111,所以這個表達式是為了將a[i]轉變成大寫字母
b[i]=b[i]|0x20
|按位或,就是將符號兩邊都先化為二進制,再進行運算
0x20化為二進制為00100000
所以這個表達式就是為了將b[i]轉變成小寫字母
注意下面的問題:
請教8086匯編語言中ASSUME偽指令的作用!
1.書上說ASSUME語句可以使定義的段與段寄存器對應起來而在每一個ASSUME 語句后為什么還要通過如下的指令語句來給對應的段寄存器賦值?
??? ASSUME CS:CSEG, DS:DSEG
?????? MOV??????? AX, DSEG
?????? MOV??????? DS,AX
2.每個ASSUME語句后的段寄存器賦值為什么都不包括CS段的賦值語句?
先回答你的第一個問題,書上是你那樣說的,至于你的第一個疑問是因為ASSUME偽指令只是讓數據段寄存器DS與你的數據存儲地址,代碼段寄存器CS和你的代碼段所存儲的地址一一對應起來,但是如果你不人為把你的數據段存儲地址DSEG傳給DS的話,系統是無法獲得DSEG的具體物理地址的。
對于第二疑問,因為CS:IP是指向CPU將執行的下一條語句,在將程序裝載進主存時,系統就已經將CSEG的物理地址傳給了CS,所以,對于CS不需要像DS那樣人為傳遞。
之前的時候想實現將BaSic和iNfOrMaTiOn載入內存中,
assume cs:codesg,ds:datasg
datasg segment
?? ?db 'BaSic'
?? ?db 'iNfOrMaTiOn'
datasg ends
codesg segment
?? ?start:
?? ?codesg ends
end start
但是一直不行,最后找來找去才發現,除了assume指定cs和自定義的段codesg外還要將其地址關聯起來
assume cs:codesg,ds:datasg
datasg segment
?? ?db 'BaSic'
?? ?db 'iNfOrMaTiOn'
datasg ends
codesg segment
?? ?start:
?? ?mov ax,datasg
?? ?mov ds,ax
codesg ends
最后功能實現了。
2.[bx+idata]
我們常用[bx]的方式來指明一個內存單元,還可以用一種更為靈活的方式來指定內存單元:[bx+idata]
轉載于:https://my.oschina.net/liangzhenghui/blog/138125
總結
- 上一篇: 出现java.lang.Unsuppor
- 下一篇: php限制ip访问次数 并发_PHP实现