实验4 汇编应用编程和c语言程序反汇编分析
实验任务1
(1)源程序:
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 di, 1824 mov cx, 16 s: mov al, [si] mov es:[di], al mov al, 2h mov es:[di+1], al inc si add di, 2 loop s mov cx, 16 mov si, 0 add di, 128 s1: mov al, [si] mov es:[di], al mov al, 24h mov es:[di+1], al inc si add di, 2 loop s1 mov cx, 16 mov si, 0 add di, 128 s2: mov al, [si] mov es:[di], al mov al, 71h mov es:[di+1], al inc si add di, 2 loop s2 mov ah, 4ch int 21h code ends end start
任务1实现的关键在于找到打印的位置,为了放在中间,首先确定是11,12,13这三行,然后再取列的中间位置,将字符和颜色等属性赋值进去即可。关于显示字符的颜色,背景色等只需在指定的位置进行标记即可。
(2)运行结果截图:

实验任务2
(1)源代码:
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
(2)运行结果截图:

代码修改后的运行结果:

问题一:
为了保存bx,cx,si,di的值,因为随后在s的循环中这些寄存器都会被使用,值会发生改变,而用栈将这些值保存起来,在循环结束后可以使这些值复原,从而提高了寄存器的利用效率。
问题二:
line30的作用是将每次需要输入的字符以及其颜色配置信息赋值到指定的位置,从而使其在屏幕上显示。
实验任务3:
(1)反汇编截图:

数据截图:

(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 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
输出截图(包括更换数值的截图):



实验任务4:
(1)源代码:
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
(2)运行测试截图;

line12-19使用了int 21h的1号功能,不断的读入从键盘输入的字符,并通过比较判断是否出现#,出现#则继续后面的程序。
line21-27使用了int 21h的2号功能,从数据段不断的输出字符到屏幕上。
实验任务5:
反汇编截图:


从汇编的角度,参数先传递给相关的寄存器,这里是eax和ecx寄存器,返回值是是通过得到相加后结果的eax由ret指令返回。
本程序中参数的入栈顺序是从后往前;函数调用都会先用栈报错相关的参数,在函数结束时再用push进行复原操作。
实验总结:
(1)通过本次的上机实验,我理解了80×25彩色字符模式显示原理,并能够编写汇编指令在指定的位置显示字符并设置显示的形式;
(2)对于jmp, je, jcxz等跳转指定可以熟练使用,并可以用这些指定设计简单的逻辑程序;
(3)掌握了call, ret等指令的用法,并可以编写简单的函数进行调用;
(4)了解了在visual studio环境反汇编c语言程序的方法,并简单分析编译器反汇编生成的代码;
(5)对于高级语言反汇编参数传递,返回值的返回,参数入栈顺序等过程有了一定的了解。
浙公网安备 33010602011771号