实验4 汇编应用编程和c语言程序反汇编分析
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了实验4 汇编应用编程和c语言程序反汇编分析,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3513字,纯文字阅读大概需要6分钟。
内容图文
![实验4 汇编应用编程和c语言程序反汇编分析](/upload/InfoBanner/zyjiaocheng/617/06eaaea28817485781f28925a37da482.jpg)
实验任务1
任务内容:
教材「实验9 根据材料编程」(P187-189)编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。
代码如下:
assume cs:code
data segment
db 'welcome to masm!'
db 2,36,113
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b86eH
mov es,ax
mov bx,0
mov cx,3
s1: push cx
mov cx,16
mov si,0
mov di,64
s: mov al,[si]
mov es:[di],al
mov al,[16+bx]
mov es:[di+1],al
inc si
add di,2
loop s
inc bx
mov ax,es
add ax,0ah
mov es,ax
pop cx
loop s1
mov ax,4c00h
int 21h
code ends
end start
实验结果:
代码分析data段:
首先将字符串'welcome to masm!'存入内存
再计算出要求的颜色(绿色、绿底红色、白底蓝色)对应的颜色属性为2,36,113(10进制)
code段:
将data地址赋值给ds,用于将数据段数据存入指定内存地址
计算屏幕中间上一排对应的段地址为0b86eh,并将其赋值给额外数据段es
mov bx,0 用bx标记当前输出行数
mov cx,0需要输出三行,因此外层循环为3次
需要嵌套使用loop指令因此将当前cx压入栈,并标记为s1
内存循环:共16个字符,因此循环16次
计算输出到中间列的起始列偏移量为64,因此mov di,64,并将字符赋值到es:[di]
对应的颜色属性为[16+bx],将其赋值到es:[di+1]
一行输出结束,进入下一行,将es+0ah
pop cx进入下一循环。
实验任务2
代码如下:
assume cs:code, ds:data
data segment
str db 'try', 0
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, offset str
mov al, 2
call printStr
mov ah, 4ch
int 21h
printStr:
push bx
push cx
push si
push di
mov bx, 0b800H
mov es, bx
mov di, 0
s: mov cl, [si]
mov ch, 0
jcxz over
mov ch, al
mov es:[di], cx
inc si
add di, 2
jmp s
over: pop di
pop si
pop cx
pop bx
ret
code ends
end start
实验结果:
?
把line3改为: str db 'another try', 0
把line12改为:mov al, 4
?
在 line18-40中:line19-22, line36-39,在子程序的开始将子程序中所有用到的寄存器中的内容都用栈保存起来,在子程序返回前再恢复,line30的功能是设置字符颜色属性。
实验任务3
代码如下:
assume cs:code, ds:data
data segment
x dw 1984
str db 16 dup(0)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax,0b800h
mov es,ax
mov ax, x
mov di, offset str
mov si,0
call num2str
mov ah, 4ch
int 21h
num2str:
push ax
push bx
push cx
push dx
mov cx, 0
mov bl, 10
s1:
div bl
inc cx
mov dl, ah
push dx
mov ah, 0
cmp al, 0
jne s1
s2:
pop dx
or dl, 30h
mov [di], dl
mov dh,2
mov es:[si],dx
add si,2
inc di
loop s2
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
实验结果:
实验任务4
代码如下:
assume cs:code, ds:data
data segment
str db 80 dup(?)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, 0
s1:
mov ah, 1
int 21h
mov [si], al
cmp al, '#'
je next
inc si
jmp s1
next:
mov cx, si
mov si, 0
s2: mov ah, 2
mov dl, [si]
int 21h
inc si
loop s2mov ah, 4ch
int 21h
code ends
end start
?
汇编、链接、运行程序,输入一个字符串并以#结束。
实验结果:
实验任务5
在visual studio集成环境中,编写一个简单的包含有函数调用的c程序。
代码如下:
#include <stdio.h>
int sum(int, int);
int main() {
int a = 2, b = 7, c;
c = sum(a, b);
return 0;
}
int sum(int x, int y) {
return (x + y);
}
实验结果:
结果分析:从汇编角度分析反汇编代码可知,高级语言中参数传递和返回值是通过栈实现的。参数传递顺序:先将参数b入栈,再将参数a入栈,都是借助寄存器完成的。
内容总结
以上是互联网集市为您收集整理的实验4 汇编应用编程和c语言程序反汇编分析全部内容,希望文章能够帮你解决实验4 汇编应用编程和c语言程序反汇编分析所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。