找回密码
 立即注册
查看: 2011|回复: 0

汇编语言笔记(第七章)

[复制链接]

78

主题

109

回帖

1023

积分

高级会员

积分
1023

猴年

龙龙实名认证 发表于 2015-6-22 03:00:34 | 显示全部楼层 |阅读模式
  
  汇编语言笔记 (第七章)
  学过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

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|虫虫联盟 ( 备案号:蜀ICP备15018121号-1 )

GMT+8, 2026-4-22 13:52 , Processed in 2.373411 second(s), 26 queries .

Powered by Discuz! X5.0 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表