首页
社区
课程
招聘
[分享]重温16位汇编,汇编实验10—— 编写子程序
发表于: 2010-7-14 14:40 4287

[分享]重温16位汇编,汇编实验10—— 编写子程序

2010-7-14 14:40
4287
突然心血来潮,把王爽老师的汇编又拾起来了,这次看比以前好多了,把内存单元地址、位置、长度重新滤了下,果然清晰多了。
第十章 汇编实验10—— 编写子程序

分析:
步骤一、列举
数据>SA:EA;
显存>SA:EA;
参数>dh行,dl列,cl颜色
步骤二、判断显存起始地址
显存起始段地址:SA=0B800H
显存起始偏移地址:EA=行数*每行存储字节=dh*(80个字符*2字节)//每行可以存储80个字符,每个字符占用2字节。
步骤三、数据传输
把数据传送到显存的偶地址;
把颜色传送到显存的奇地址。
步骤四、判断和返回
判断数据是否=0;
如果结果是则返回到call的下一条指令地址。

指令:

assume cs:code,ds:data
data segment
db 'Welcome to masm!xiao',0
data ends
code segment
start:
mov ah,8
mov al,3
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str

mov ax,4c00H
int 21H
;=========================================================
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),
; (cl)=颜色,ds:si指向字符串的首地址
;返回:无
;=========================================================
show_str:
push ax
push cx
push si
push bx
mov ax,0B872H
mov es,ax

mov ax,160 ;每行80个字符,160个字节
mul dh ;160个字节乘以行数=行的起始地址,即当前AX中存放显存中的起始偏移地址
mov bx,ax ;显存的起始偏移地址存放到bx中
mov ah,cl

s:
mov cl,ds:[si]
mov es:[bx],cl ;把数据存放到显存的偶地址。
mov ch,0
jcxz s1
mov es:[bx+1],ah ;把颜色存放到显存的奇地址。
inc si
add bx,2
loop s
s1:
pop bx
pop si
pop cx
pop ax
ret
code ends
end start


实现的方法不只这一种,还有其他的很多种,我用的loop循环,也可以使用jmp short 标号等。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 168
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
嘿嘿,16位汇编啊,自己当年最喜欢的东东~

但为什么感觉现在慢慢的变了味了呐???
2010-7-14 15:00
0
游客
登录 | 注册 方可回帖
返回
//