实验4 汇编应用编程和c语言程序反汇编分析
1.实验任务1
编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。
assume cs:codesg, ds:datasg, ss:stacksg datasg segment db 'welcome to masm!' db 2h,24h,71h ;三行字符串显示颜色 datasg ends stacksg segment db 16 dup (0) stacksg ends codesg segment start: mov ax,datasg mov ds,ax mov ax,stacksg mov ss,ax mov sp,16 ;栈顶偏移 mov ax,0B872h mov cx,3 ;显示3行,循环3次 mov bx,0 ;控制偏移,获取颜色 s:mov es,ax ;附加段寄存器显示缓冲区地址 push ax push cx mov si,0 ;偏移读取字符 mov di,0 ;偏移存储读取到的字符 mov cx,16 ;循环16次读取字符串 s0:mov al,[si] ;暂存读到的字符,一个字符8位 mov es:[di],al ;读到的字符显示放在缓冲区 inc si ;si++ add di,2 ;偶数偏移存放字符 loop s0 mov al,[bx+si] ;获取第一个颜色 mov cx,16 mov di,1 ;偏移存储颜色属性 s1:mov es:[di],al add di,2 ;奇数偏移存储颜色属性 loop s1 ;第一行颜色内容位置显示完成 pop cx pop ax ;取出初始缓冲区 add ax,000ah inc bx ;取下一个颜色 loop s mov ax,4c00h int 21h codesg ends end start

2.实验任务2
编写子程序printStr,实现以指定颜色在屏幕上输出字符串。调用它,完成字符串输出。
assume cs:code, ds:data data segment str db 'another try', 0 data ends code segment start: mov ax, data mov ds, ax mov si, offset str mov al, 4 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


(1)line19-22,line36-39的目的是暂存对应寄存器内容以便于子程序运行完后恢复
(2)line30的功能是将字符数据和对应属性存储到显存中
3.实验任务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, 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


对task3.asm源代码进行修改、完善
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 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 bx,0b800H mov es,bx mov es:[si],dx inc si inc si inc di loop s2 pop dx pop cx pop bx pop ax ret code ends end start


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

line12-19实现读取键盘输入的字符,并判断是否为#,为#则结束
line21-27实现输入读取的以#结尾的字符串
5.实验任务5
#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); }


在高级语言中,参数传递在汇编语言中通过mov指令向寄存器赋值,入栈顺序按照高级语言从右向左的顺序;
通过call指令调用sum函数,返回值同样通过mov指令存入寄存器。

浙公网安备 33010602011771号