实验4 汇编应用编程和c语言程序反汇编分析
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了实验4 汇编应用编程和c语言程序反汇编分析,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4425字,纯文字阅读大概需要7分钟。
内容图文
实验内容
1.实验内容1
教材「实验9 根据材料编程」(P187-189) 编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。
程序正确编写后,预期输出结果如下:
在内存地址空间中,B8000H~BFFFFH供32KB的空间,为80×25彩色字符模式的显示缓冲区。该显示缓冲区分为8页,每页4KB(≈4000B),每页有25行,一行可显示80个字符,一个字符占两个字节,共160个字节,低位字节存储字符的ASCII码,高位字节存储字符的颜色属性。
屏幕中间对应的显存位置的计算:以B800H作为段地址,要在屏幕中间显示三行字符串,这三行字符串应分别显示在第12、13、14行。要显示的字符串占16个字节,每个字符的颜色属性占16个字节,共32个字节,因为一行有160个字节,所以要让字符显示在屏幕中间,应从每行的第33列,即第64个字节开始存放字符及其颜色属性。第12行的开始处的偏移地址为1760,再加上64,等于1824,转换为十六进制就是720H。所以要显示的第一行字符串的起始位置偏移地址应为720H,加上160个字节就是第二行字符串起始位置的偏移地址,加上320个字节就是第3行字符串的起始位置的偏移地址。
字符串颜色属性的设置:根据属性字节的格式即可按位设置属性字节
黑底绿字:属性字节为00000010B,十六进制为02H;
绿底红字:属性字节为00100100B,十六进制为24H;
白底蓝字:属性字节为01110001B,十六进制为71H。
代码:
assume cs:code, ds:data data segment db 'welcome to masm!' data ends code segment start: mov ax,data mov ds,ax mov ax,0b800h mov es,ax mov si,0 mov bx,1824 mov cx,16 s: mov ah,2h; mov al,[si] mov es:[bx],ax mov ah,24h mov es:[bx+160],ax mov ah,71h mov es:[bx+320],ax inc si add bx,2 loop s mov ah,4ch int 21h code ends end start
运行结果:
2.实验任务2
编写子程序printStr,实现以指定颜色在屏幕上输出字符串。调用它,完成字符串输出。
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改为:
1 str db 'Darth Vader wins!', 0
将line12改为:
1 mov al,4
再次汇编连接,运行并观察结果:
line19-22, line36-39,这组对称使用的push、pop,这样用的目的是什么?
bx、cx、si、di寄存器在子程序中需要使用,将会改变它们的值。为了保存现场,不使调用程序出现问题,故用栈保存这些寄存器的值,在开始操作前压入栈中,在返回前弹出。这样,这些寄存器的值在调用子程序之前和之后将保持不变。line31的功能是什么?
line27将[si],即字符信息写入了cl寄存器当中。line30将al,即色彩信息写入了ch寄存器。此时,cx中的数据即为完整的显示单元(字符+颜色)。故line31将cx写入es:[di],即显存中。因此,line31的功能为将组合完毕的显示内容写入显存,显示在屏幕上。3.实验任务三
1.子任务1
汇编、链接task3.asm,并使用debug进入调试。
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, x mov di, offset str 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 inc di loop s2 pop dx pop cx pop bx pop ax ret code ends end start
使用u命令进行反汇编,可见应执行至076C:000E。使用g E命令执行至076C:000E,如下图:
使用-g 000e后:
可以发现DI = 0006
使用-d 2 5 查看内存中的元素:
可见,程序成功实现了将数字转换为字符串的功能。
2.子任务2
修改后源程序如下:
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, x mov di, offset str call num2str mov si, offset str mov al, 2 call printStr 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 inc di loop s2 mov byte ptr [di], 0 pop dx pop cx pop bx pop ax ret 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
其中,line16、line17的功能是为printStr子程序提供必要的输入信息。line46的功能为在转换完毕的字符串后添加0,构造为字符串。printStr子程序本身与任务2中一致。
运行结果如下:
改变数据,再次测试,如下图:
可见,程序实现了所需的功能。
4.实验任务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 s2 mov ah, 4ch int 21h code ends end start
运行结果如图所示:
内容总结
以上是互联网集市为您收集整理的实验4 汇编应用编程和c语言程序反汇编分析全部内容,希望文章能够帮你解决实验4 汇编应用编程和c语言程序反汇编分析所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。