式武神

导航

汇编语言实验四

一、实验目的

1. 理解80×25彩色字符模式显示原理
2. 理解转移指令jmp, loop, jcxz的跳转原理,掌握使用其实现分支和循环的用法
3. 理解转移指令call, ret, retf的跳转原理,掌握组合使用call和ret/retf编写汇编子程序的方法,掌握
参数传递方式
4. 理解标志寄存器的作用
5. 理解条件转移指令je, jz, ja, jb, jg, jl等的跳转原理,掌握组合使用汇编指令cmp和条件转移指令实
现分支和循环的用法
6. 了解在visual studio/Xcode等环境或利用gcc命令行参数反汇编c语言程序的方法,理解编译器生成
的反汇编代码
7. 综合应用寻址方式和汇编指令完成应用编程

二、实验准备

实验前,请复习/学习教材以下内容:
第9章 转移指令的原理
第10章 call和ret指令
第11章 标志寄存器

三、实验内容

1. 实验任务1
教材「实验9 根据材料编程」(P187-189)
编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。

assume cs:code
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,11*160+60
mov cx,16
s1:mov al,ds:[si]
mov ah,0000010B
mov es:[di],ax
inc si
add di,2
loop s1

mov si,0
mov di,12*160+60
mov cx,16
s2:mov al,ds:[si]
mov ah,00100100B
mov es:[di],ax
inc si
add di,2
loop s2

mov si,0
mov di,13*160+60
mov cx,16
s3:mov al,ds:[si]
mov ah,01110001B
mov es:[di],ax
inc si
add di,2
loop s3

mov ax,4c00h
int 21h
code ends
end start

运行结果:

 

2. 实验任务2
编写子程序printStr,实现以指定颜色在屏幕上输出字符串。调用它,完成字符串输出。

使用任意文本编辑器,录入汇编源程序task2.asm。

 1 assume cs:code, ds:data
 2 data segment
 3 str db 'try', 0
 4 data ends
 5 
 6 code segment
 7 start:
 8 mov ax, data
 9 mov ds, ax ;设置入口参数ds
10 
11 mov si, offset str ; 设置入口参数si
12 mov al, 2 ; 设置入口参数al
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 s: mov cl, [si]
27 mov ch, 0
28 jcxz over
29 mov ch, al
30 mov es:[di], cx
31 inc si
32 add di, 2
33 jmp s
34 
35 over:
36 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,这样用的目的是什么?

子程序中使用的寄存器,在主程序中可能也会使用,会造成冲突,这组对称使用的push、pop是将子程序使用的寄存器中的内容保存起来,在子程序返回前再恢复,避免寄存器冲突。
line30的功能是什么?

将cx中存放的字符串的内容移入es即显存区域中显示。

 

3. 实验任务3
使用任意文本编辑器,录入汇编源程序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 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

 

子任务1
对task3.asm进行汇编、链接,得到可执行程序后,在debug中使用u命令反汇编,使用g命令执行
到line15(程序退出之前),使用d命令查看数据段内容,观察是否把转换后的数字字符串'1984'存放
在数据段中str标号后面的单元。

子任务2
对task3.asm源代码进行修改、完善,把task2.asm中用于输出以0结尾的字符串的子程序加进来,
实现对转换后的字符串进行输出。

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

运行结果:

把task3.asm源代码中,line3中整数改成0~2559之间的任意数值,运行测试,观察结果。

 

实验任务4
使用任意文本编辑器,录入汇编源程序task4.asm。

 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

汇编、链接、运行程序,输入一个字符串并以#结束(比如,2020, bye#)观察运行结果。

结合运行结果,理解程序功能,了解软中断指令。具体地

line12-19实现的功能是?

从键盘中输入字符串,并将输入的字符串存入data中,当输入#号时结束并转移到next。
line21-27实现的功能是?

将data中存放的字符串输出到屏幕上。

5. 实验任务5
在visual studio集成环境中,编写一个简单的包含有函数调用的c程序。代码如下:

在line7, line13分别设置断点,在调试模式下,查看反汇编代码。

分析反汇编代码,从汇编的角度,观察高级语言中参数传递和返回值是通过什么实现的,以及,参数入
栈顺序,返回值的带回方式,等等。

高级语言中参数传递和返回值通过寄存器实现。

参数入栈顺序从右向左。

返回值的带回方式是通过寄存器带回。

posted on 2020-12-13 12:39  式武神  阅读(256)  评论(3编辑  收藏  举报