找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1465|回复: 0

汇编语言笔记(第七章)

[复制链接]
  • TA的每日心情
    开心
    2018-10-31 14:26
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    78

    主题

    109

    回帖

    1019

    积分

    高级会员

    积分
    1019

    猴年

    龙龙实名认证 发表于 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

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

    本版积分规则

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

    GMT+8, 2024-11-23 16:07 , Processed in 0.331632 second(s), 26 queries .

    Powered by Discuz! X3.5 Licensed

    © 2001-2024 Discuz! Team.

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