前面总结了汇编的寄存器及相关知识,这里了解一下汇编代码的编写并做一个读代码小练习。
代码解析
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