汇编子程序

前面总结了汇编的寄存器及相关知识,这里了解一下汇编代码的编写并做一个读代码小练习。

代码解析

assume cs:code

data segment
    db 'conversation',0
data ends

code segment
start:  mov ax,cs   
        mov ds,ax
        mov si,offset capital//cs:si 为capital所在代码开始,在汇编中表示某位置使用段地址+偏移量来进行定位的,下面的读取也是类似。
        mov ax,0
        mov es,ax
        mov di,200h //es:di 为200h+0开始
        mov cx,offset capitalend-offset capital  ;两地址相减作为复制长度
        cld         ;清除DF标志为0,是数据按地址又低到高的正确顺序传输
        rep movsb   ;DS:SI这段地址的N个字节复制到ES:DI指向的地址

        ;以上一段代码作用为从capital段到capitalend复制code到200h+0的位置,共11h行

        mov ax,0
        mov es,ax
        mov word ptr es:[7ch*4],200h
        mov word ptr es:[7ch*4+2],0//这两行作用为指定int 7ch开始地址为200h(这里的7ch是我们自己定义的中断,中断的赋值概念低地址位为偏移量,高地址位为段值)
        mov ax,data//这里也就是0000:0200位置
        mov ds,ax
        mov si,0
        int 7ch;自定义终端,不一定为7c
        ;调用复制的capital代码

        mov ax,data
        mov es,ax;数据起地址data
        mov bp,0;偏移量0 //这里取es:bp位置的值,也就是转化之后的数据
        mov al,0;光标跟随输出位置                 
        mov bl,9;蓝色高亮
        mov bh,0;页数,0为当前页
        mov dh,0;y坐标                
        mov dl,0;x坐标                  
        mov cx,12;12个大小的长度
        mov ah,13h;输出字符
        ;上方为设置参数
        int 10h//这里是int 10h截断,有相关网址进行介绍
        ;输出

        mov ax,4c00h
        int 21h
        ;退出
capital:    push cx;压入cx用以计数
        push si;压入si用以计数
change:     mov cx,[si]
        mov ch,0
        jcxz ok;判断cx为0退出
        and byte ptr [si],11011111b;a='1100001' A='1000001'所以‘&’一下就是就是小写字符转化为大写字符了。
        inc si
        jmp short change
ok:     pop si;执行si出栈
        pop cx;执行cx出栈
        iret
capitalend: nop

code ends
end start

相关知识点

程序详解:http://blog.sina.com.cn/s/blog_171daf8e00102xcur.html

汇编语言的调试方法:http://www.cnblogs.com/hustlijian/archive/2011/06/04/2072656.html

Int 10h相关设置的知识点:http://www.cnblogs.com/magic-cube/archive/2011/10/19/2217676.html

汇编中字、双字、字节关系:https://zhidao.baidu.com/question/270682681.html

程序中出现的rep movesb 以及cld详解:https://zhidao.baidu.com/question/270682681.html

Contents
  1. 1. 代码解析
  2. 2. 相关知识点
|