龙龙 发表于 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中查看寄存器变化和相应地址空间的值。
  待续...
  
  我们之前学过这个用法,他得段寄存器是ds,是他得偏移地址
  例如:
  mov cx,
  意思就是:把段地址为ds,偏移地址为bx+100的这个内存单元的数据送人cx中
  逻辑表达就是ds*16++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,
  and al,11011111b
  mov ,al
  mov al,
  or al,00100000b
  mov ,al
  inc bx
  loop s
  mov ax,4c00h
  int 21h
  qq ends
  end start
  si和di这两个寄存器,和bx寄存器功能相近,作为偏移地址时,他们的段地址都默认在ds中存放
  如:mov bx,1
  mov al,
  mov si,1
  mov al,
  功能一样!
  唯一不同的是,bx可以分为bl和bh两个8位寄存器,而si和di不能分成两个8位寄存器
  书上7.2,把wlcome to masm 复制到他后面的数据区中,
  我们先用的方法来写,一次复制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,
  mov ,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,
  mov ,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,
  mov ,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,
  mov ,al
  inc di
  inc si
  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
  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,
  and al,11011111b
  mov ,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,
  and al,11011111b
  mov ,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,
  and al,11011111b
  mov ,al
  inc si
  loop s1
  add bx,9
  pop cx
  loop s
  mov ax,4c00h
  int 21h
  qq ends
  end start
页: [1]
查看完整版本: 汇编语言笔记(第七章)