• 汇编语言(王爽) 第9章转移指令的原理


    啥叫转移指令

    修改IP或同时修改CS和IP的指令

    只修改IP叫段内转移

    同时修改CS和IP叫段间转移

    段内转移又分为短转移和近转移

    短转移 IP修改范围-128-127

    近转移IP修改范围-32768-32767

    基本的就上面的

    9.1 offset 操作符

    s1:mov bx,offset s1

    s:mov ax,offset s

    offset X就是取得X的偏移地址

    first 就是mov bx,ds:ds:[0]

    second  is mov ax,ds:[3]

    first instruction is 3 byte

    9.3 依据位移转移的JMP指令

    jmp short 标号(转到标号处执行指令)

    其实跳到哪里是看指令的偏移地址,上面说法是错的,比如实验8,分析一个奇怪的程序

    9.4 指定转移目的地的指令

    jmp far ptr段间转移 远转移

    比如 jmp far ptr s 对应的机器码是EA 0B 01 BD 0B

    高地址0bdbh是转移的段地址,低地址010bH是偏移地址

    9.5 jmp 寄存器

    jmp ax

    设置IP=ax

    9.6 转移地址在内存中的jmp指令

    1 jmp word ptr 内存单元地址(段内转移)

    mov ax,0123h

    mov ds:[0],ax

    jmp word ptr ds:[0]

    执行后ip=0123h

    2 jmp dwood ptr 内存单元地址(段间转移) 2个字

    mov ax,0123h

    mov ds:[0],ax

    mov word ptr ds:[2],0

    jmp dword ptr ds:[0]

    执行后cs=0.ip=0123h

    9.7 jcxz

    if(cx==0) jmp short 标号

    9.8 loop

    cx--

    if(cx!=0) jmp short 标号

    9.10 编译器对转移位移越界会报错

    比如

    jmp short s

    db 128 dup (1)

    s:mov ax,0111h

    因为short的IP偏移地址是-128-127

    所以超过了1,报错

    下面是实验8一个奇怪的实验,主要考察dmp short 标号指令的偏移应用

    http://tinylab.org/assembly/sy/sy8.htm

    实验9是一个在DOS上打文字的程序

    assume cs:code,ds:data
    data segment
    db 'welcome to masm!'
    db 02h,24h,24h
    data ends
    code segment
    start:
    mov ax,0b872H
    mov es,ax

    mov ax,data
    mov ds,ax

    mov bx,0
    mov cx,16
    mov di,0
    s:
    mov al,ds:[bx]
    mov ah,ds:[18]
    mov es:[di],ax
    inc bx
    add di,2
    loop s

    mov ax,4c00h
    int 21h
    code ends
    end start

    源代码就这样

    反正是在显存段b8000H-b8f9fH进行,2个字节的长度,一个放ASCII码另一个放属性

    属性就是指背景色,字体色这些

    EOF

  • 相关阅读:
    maven
    sublime text
    ios category
    python
    activiti
    出版社
    gradle
    selenium
    spring
    Ansible状态管理
  • 原文地址:https://www.cnblogs.com/wz0107/p/5380191.html
Copyright © 2020-2023  润新知