源程序:
assume cs:code,ds:data data segment db ‘Welcome to masm!‘ db 16 dup(2) ;绿色 db 16 dup(36) ;绿底红色 db 16 dup(113) ;白底蓝色 data ends stacksg segment dw 8 dup(0) ;栈段用来临时存放cx stacksg ends code segment start: mov ax,data mov ds,ax ;data段地址送到ds mov ax,stacksg mov ss,ax ;stacksg段地址送到ss mov sp,16 mov ax,0b800h ;显存地址送到es mov es,ax mov bx,16 mov bp,0 mov cx,3 ;外层循环3次 s0: push cx ;外层循环cx值入栈 mov si,0 mov di,1824 ;显存地址:行:(25-3)/2=11,列:11*160+(160-32)/2 mov cx,16 ;内层循环16次 s: mov al,[si] mov es:[bp+di],al ;ascll码数据放入显存地址 mov al,[bx+si] mov es:[bp+di+1],al ;属性数据放入显存地址 inc si add di,2 loop s add bx,16 ;内存地址换行 add bp,160 ;显存地址换行 pop cx ;从栈顶弹出原cx的值,恢复cx loop s0 mov ah,4ch int 21h code ends end start
运行结果截图
源程序
1 assume cs:code, ds:data 2 data segment 3 str db ‘another try‘, 0 4 data ends 5 6 code segment 7 start: 8 mov ax, data 9 mov ds, ax 10 11 mov si, offset str 12 mov al, 4 13 call printStr 14 15 mov ah, 4ch 16 int 21h 17 18 printStr: 19 push bx 20 push cx 21 push si 22 push di 23 24 mov bx, 0b800H 25 mov es, bx 26 mov di, 0 27 s: mov cl, [si] 28 mov ch, 0 29 jcxz over 30 mov ch, al 31 mov es:[di], cx 32 inc si 33 add di, 2 34 jmp s 35 36 over: pop di 37 pop si 38 pop cx 39 pop bx 40 ret 41 42 code ends 43 end start
运行结果截图
把line3改为: str db ‘another try‘, 0
把line12改为:mov al, 4
再次汇编、运行程序,观察运行结果。
基于运行结果,理解源代码,以及,组合使用转移指令call和ret实现子程序的原理与方法。具体地,在line18-40中:
line19-22, line36-39,这组对称使用的push、pop,这样用的目的是什么?
实现数据的暂存,可用的寄存器有限,将一些寄存器中的数据暂存起来,在子程序中使用寄存器就不会影响原来的值
line30的功能是什么?
mov ch,al:设置字符的属性
子任务1
子任务2
对task3.asm源代码进行修改、完善,实现对转换后的字符串进行输出。
1 assume cs:code, ds:data 2 data segment 3 x dw 2001 4 str db 16 dup(0) 5 data ends 6 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 mov ax,0b800H 12 mov es,ax 13 mov ax, x 14 mov di, offset str 15 mov si,0 16 call num2str 17 18 mov ah, 4ch 19 int 21h 20 21 num2str: 22 push ax 23 push bx 24 push cx 25 push dx 26 27 mov cx, 0 28 mov bl, 10 29 s1: 30 div bl 31 inc cx 32 mov dl, ah 33 push dx 34 mov ah, 0 35 cmp al, 0 36 jne s1 37 s2: 38 pop dx 39 or dl, 30h 40 mov [di], dl 41 mov dh,2 42 mov es:[si],dx ;添加的代码 43 inc di 44 add si,2 45 loop s2 46 47 pop dx 48 pop cx 49 pop bx 50 pop ax 51 52 ret 53 code ends 54 end start
把task3.asm源代码中,line3中整数改成0~2559之间的任意数值,运行测试,观察结果。
程序源代码
1 assume cs:code, ds:data 2 data segment 3 str db 80 dup(?) 4 data ends 5 6 code segment 7 start: 8 mov ax, data 9 mov ds, ax 10 mov si, 0 11 12 s1: 13 mov ah, 1 14 int 21h 15 mov [si], al 16 cmp al, ‘#‘ 17 je next 18 inc si 19 jmp s1 20 next: 21 mov cx, si 22 mov si, 0 23 s2: mov ah, 2 24 mov dl, [si] 25 int 21h 26 inc si 27 loop s2 28 29 mov ah, 4ch 30 int 21h 31 code ends 32 end start
运行测试截图
结合运行结果,理解程序功能,了解软中断指令。具体地:
line12-19实现的功能是?
从键盘输入字符,遇到‘#‘通过转移指令中断
line21-27实现的功能是?
输出栈内的字符
在visual studio集成环境中,编写一个简单的包含有函数调用的c程序。代码如下:
1 #include <stdio.h> 2 int sum(int, int); 3 4 int main() { 5 int a = 2, b = 7, c; 6 7 c = sum(a, b); 8 9 return 0; 10 } 11 12 int sum(int x, int y) { 13 return (x + y); 14 }
在line7, line13分别设置断点,在调试模式下,查看反汇编代码。
总结对这个简单的c代码反汇编后,你对反汇编出来的汇编指令分析的内容总结。
参数传递和返回值是通过栈实现的
原文:https://www.cnblogs.com/wyyhhh/p/14131164.html