• 汇编第四日


    段的起始地址总是16的倍数,设段中数据占N字节,那么段的大小为(N/17+1)/16字节

    CPU执行指令(如果end 之后没有标号的话)默认是从伪代码后第一行指令开始,有标号后会从用户指定的指令开始执行

    and al, 10111111B:将第6位设置成0,其余位不变

    or al, 01000000B:将第4位设置成1,其余位不变

    '   '符号来定义字符,例如 db 'UNIX'

    db,dw,dq(4字)这些都是伪指令,只给编译器识别

    那么其在内存中分布情况为:

    mov ax, ‘a’  把a对应的ASCII码'61H'赋值给ax

     ASCII编码的一个字符占1字节,但实际大小只有7位,unicode编码占4字节

    [bx+idata]表示有时更方便,例如:

    ① A,B,C,D,E   ② a,b,c,d,e  将①中数据变小写,②变大写

    如果没有[bx+idata]写的话:用两个循环,一个改成小写,一个改成大写

    一个循环:

    ds:[bx]将A变成a,之后写成ds:[bx+5]将a变成A

    si寄存器和di寄存器类似于bx寄存器,可以保存内存地址,但是前两者无法分成高低8位

    到此,内存单元可以表示成

    [ds+si+idata],[bx+si],[bx+idata],[bx].idata,idata[bx],[bx].idata[si]

                   (寄存器和寄存器)

     ;用来表达注释

    cx寄存器表达数据范围为0 - (2^16) - 1   所以一旦0 减去 1后结果会变成FFFFH((2^16) - 1)

    对于多层循环,要注意cx寄存器的使用内层循环会覆盖掉外层循环的cx寄存器值

    解决方法:

    进入内层循环前,先将cx数据保存在栈中,等到退出内层循环中,再pop将cx恢复到外层循环状态

    只有bx,bp,si,di用在表示内存单元,配合使用规则:

    bx与si , bx与di,bp与si,bp与di  可以配合使用

    bx与bp,si与di   均不可以

    bp寄存器相当于sp寄存器对于[bp]这样表示,那么默认的段地址在sp寄存器中,但可以显式指定段前缀:例如ds:[bp],cs:[sp]

    对于mov ax,1指令,其中的立即数1,直接反映在该指令对应的机器码中,对于指令则放在指令缓冲器中

    指明处理数据长度:

    ①寄存器指明   :mov ax,  [1]内存偏移地址为1的字型数据,al则为字节型数据

    ②xxx ptr 

    mov word ptr ds:[0], 1(1当成字型数据)

    mov byte ptr ds:[0], 1(1当成字节数据)

    ③默认长度

    push和pop都是字型数据

    对于类似于结构体bx中,idata为结构体中某数据项,si为某数据项为数组中的元素:

    那么定位该元素可以表达成[bx].idata[si] = [bx+idata+si]

    div指令执行除法:

    ①除数为8位,则被除数为16位保存在ax中,结果商放在al中,余数放在ah中

    ②除数为16位,则被除数为32位保存在dx(高16位)和ax(低16位)中,结果商放在ax中,余数放在dx中

    为什么除数n位,被除数就要2*n位

    因为CPU总是用加法来模拟其他运算,例如乘法2*3用2+2+2模拟,那么也用乘法模拟除法,例如9/4,4*1 < 9,那么再用4 * 2 < 9,直到4 * 3 > 9结束,返回前一步,知道结果为2,余数为9 - 2*4 =1,这就要求被除数要比除数大来防止检验过程中数据溢出

    除法过程:

    div bx:除数bx为16位,所以被除数要32位:

    (ax) = ((dx)*10000H + (ax))/(bx)的商

    (dx) = ((dx)*10000H + (ax))/(bx)的余数

    div byte ptr ds:[0]:byte ptr指明除数为8位,所以被除数为16位:

    (al) = (ax)/((ds)*16 + 0)的商

    (ah) = (ax)/((ds)*16 + 0)的余数

    div word ptr ds:[0]:word ptr指明除数为16位,所以被除数为32位:

    (ax) = ((dx)*10000H + (ax))/((ds)*16 + 0)的商

    (dx) = ((dx)*10000H + (ax))/((ds)*16 + 0)的余数

    为什么dx要乘以10000H?

    10000H = 16^4D,在十六进制下,即数据左移4位,后面多出来的4个0刚好给ax内容

    dd = define double word(32bit)

    实现64位功能条件:64位CPU,64位OS,64位软件,当中少一项都为32位

    dup指令:

    db 3 dup(0):定义3字节,且内容都为0

    db 4 dup(0,1,2):定义9字节,内容为0,1,2,0,1,2,0,1,2

     Done!!!

  • 相关阅读:
    java实现第四届蓝桥杯黄金连分数
    freemarker 取值(插值)(转)
    js获取ModelAndView值的问题
    kaptcha验证码的使用(转)
    springboot自定义错误页面(转)
    SpringBoot实战之异常处理篇
    BootstrapValidator实现注册校验和登录错误提示效果(转)
    org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported
    springmvc 通过异常增强返回给客户端统一格式
    SpringBoot-@RequestParam
  • 原文地址:https://www.cnblogs.com/chaunceyctx/p/7287699.html
Copyright © 2020-2023  润新知