TA的每日心情 | 开心 2018-10-31 14:26 |
---|
签到天数: 18 天 [LV.4]偶尔看看III
高级会员
- 积分
- 1019
|
汇编语言笔记 (第七章)
学过C语言的都知道,在C语言中,也有逻辑与运算和逻辑或运算。汇编语言当然也有
and 和or就是
我是这么理解and和or
and的是逻辑与运算,相当于两人谈感情,0代表假,1代表真,那么必须两人同时为
真也就是1的时间,结果才能为真,如果一个人为假就是零,那么结果也就是0
如:
mov al,11111111b
and al,00000000b
那么结果就是:00000000
or是逻辑或运算,就是一厢情愿,只要有一方愿意付出,愿意为真,那么结果就能为真
如:
mov al,11111111b
oral,00000000b
那么结果就是:11111111b
ASCII码:
呵呵,这个和摩斯电码很像,喜欢无线电技术的朋友会有所体感,一个指定的值代表一个英文字母,就想电视中,嘀嘀 嘀 滴滴 滴滴呵呵!这个是无线电台相互交流时所采用的一种编码,电脑也有,我们常用的如ASCLL码,当然还有其他很多。
ASCII表。百度一下,有很大这种表,不需要大家死记,但最好能记得其中的规律。
当你打开一个win下得文本编辑器时,按下键盘的A键,屏幕上就会显示出A,具体是
怎么实现的呢?如下:
1.电脑开机,打开编辑器,按下键盘的A
2.按下以后,键盘会把这个信息传送给计算机,计算机内部通过ASCLL码进行编码,将对应值61H存储在内存空间中,
3.编辑器,从相应的内存空间取出这个值61H,送入显卡的显存当中,此事工作在文本模式下得显卡,就会利用ASCLL码进行解码,就会把61H转换为字符A
4.此时显卡驱动显示器,将A的图像显示在屏幕上,我们也就能看到
结论:大写A在ASCLL码中对应的是61H,注意这是十六进制的61.
关于其他ASCLL码值,请大家自行下载ASCLL表进行查看
以字符形式给出数据
形式为:‘...’单引号,注意是英文的单引号
如:db‘ABCD’
还不懂存储单元转换的,看日志揭秘系列的单讲。
打下这个程序:
assume cs:qq,ds:ww (把qq,ww分别和寄存器CS,DS扯上关系)
ww segment (ww段开始)
db'abcd' (定义数据,把abcd对应的ASCLL码放入地址空间)
db'ABCD' (同上)
ww ends (ww段结束)
qq segment (qq段开始)
start: mov al,'a'(start定义程序入口,mov...意思把a的ASCLL值值放入寄存器al中)
mov bl,'b'(同上)
mov ax,4c00h(和一面一句,以后解释)
int 21h
qq ends (qq段结束)
end start (程序结束,这个start和前面的staet对应)
大家可以载入debug中查看寄存器变化和相应地址空间的值。
待续...
[bx+idata]
我们之前学过[bx]这个用法,他得段寄存器是ds,[bx]是他得偏移地址
例如:
mov cx,[bx+100]
意思就是:把段地址为ds,偏移地址为bx+100的这个内存单元的数据送人cx中
逻辑表达就是ds*16+[bx]+100
运用这种方法,处理大小写转换的问题:
程序如下:
assume cs:qq,ds:ee
ee segment
db 'FisHc'
db 'LiNuX'
ee ends
qq segment
start:mov ax,ee
mov ds,ax
mov bx,0
mov cx,5
s:mov al,[bx]
and al,11011111b
mov [bx],al
mov al,[bx+5]
or al,00100000b
mov [bx+5],al
inc bx
loop s
mov ax,4c00h
int 21h
qq ends
end start
si和di这两个寄存器,和bx寄存器功能相近,作为偏移地址时,他们的段地址都默认在ds中存放
如:mov bx,1
mov al,[bx+100]
mov si,1
mov al,[si+100]
功能一样!
唯一不同的是,bx可以分为bl和bh两个8位寄存器,而si和di不能分成两个8位寄存器
书上7.2,把wlcome to masm 复制到他后面的数据区中,
我们先用[bx+idata]的方法来写,一次复制1字节
assume cs:qq,ds:ee
ee segment
db 'welcome to masm!'
db '...............'
ee ends
qq segment
start:mov ax,ee
mov ds,ax
mov bx,0
mov cx,16
s:mov al,[bx]
mov [bx+16],al
inc bx
loop s
mov ax,4c00h
int 21h
qq ends
end start
一次复制2字节:
assume cs:qq,ds:ee
ee segment
db 'welcome to masm!'
db '...............'
ee ends
qq segment
start:mov ax,ee
mov ds,ax
mov bx,0
mov cx,8
s:mov ax,[bx]
mov [bx+16],ax
add bx,2
loop s
mov ax,4c00h
int 21h
qq ends
end start
用si和di一次复制两个字:
assume cs:qq,ds:ee
ee segment
db 'welcome to masm!'
db '...............'
ee ends
qq segment
start:mov ax,ee
mov ds,ax
mov cx,8
mov di,0
mov si,16
s:mov ax,[di]
mov [si],ax
add di,2
add si,2
loop s
mov ax,4c00h
int 21h
qq ends
end start
用si和di一次性复制一个字节:
assume cs:qq,ds:ee
ee segment
db 'welcome to masm!'
db '...............'
ee ends
qq segment
start:mov ax,ee
mov ds,ax
mov cx,16
mov di,0
mov si,16
s:mov al,[di]
mov [si],al
inc di
inc si
loop s
mov ax,4c00h
int 21h
qq ends
end start
其实第七章注重一个灵活
如:
[bx]
[idata]
[bx+idata]
[bx+si]
[si+bx+idata]
把
db '1.fishc..'
db '2.linux..'
db '3.unix...'
db '4.windows'
首字母设置为大写:
代码如下:
assume cs:qq,ds:ee
ee segment
db '1.fishc..'
db '2.linux..'
db '3.unix...'
db '4.windows'
ee ends
qq segment
start:mov ax,ee
mov ds,ax
mov bx,0
mov cx,4
s:mov al,[bx+2]
and al,11011111b
mov [bx+2],al
add bx,9
loop s
mov ax,4c00h
int 21h
qq ends
end start
把
db '1.fishc..'
db '2.linux..'
db '3.unix...'
db '4.windows'
所有字母设置为大写:
代码如下:
assume cs:qq,ds:ee,ss:tt
ee segment
db 'dll'
db 'exe'
db 'dos'
db 'win'
ee ends
tt segment
db '......'
tt ends
qq segment
start:mov ax,ee
mov ds,ax
mov ax,tt
mov ss,ax
mov sp,12
mov bx,0
mov cx,4
s1:
push cx
mov si,0
mov cx,3
s:mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
add bx,4
pop cx
loop s1
mov ax,4c00h
int 21h
qq ends
end start
双层循环,多想想就明白了
最后一例:
把
db '1.fishc..'
db '2.linux..'
db '3.hacker...'
db '4.windows'
把前四个字母设置为大写:
代码如下:
assume cs:qq,ds:ee,ss:tt
ee segment
db '1.linux..'
db '2.hacker.'
db '3.windows'
ee ends
tt segment
db '..........'
tt ends
qq segment
start:
mov ax,tt
mov ss,ax
mov sp,20
mov ax,ee
mov ds,ax
mov bx,0
mov cx,3
s:
push cx
mov si,0
mov cx,4
s1:mov al,[bx+si+2]
and al,11011111b
mov [bx+si+2],al
inc si
loop s1
add bx,9
pop cx
loop s
mov ax,4c00h
int 21h
qq ends
end start
|
|