ZZU汇编语言实验二 (保姆级教程)

1.步骤三:跟着步骤进行操作即可

2.步骤四

  •  编写显示ASCII码表的汇编语言程序

(1)    在桌面打开vscode,新建文件exp2_1.s。按照教材习题2.14的要求,编写显示ASCII码表的汇编语言程序。

要求:在数据段定义ASCII可显示字符的数值,而不是字符本身

(2)    保存文件到Desktop/ZZUassembly/ZZUNASM/experiments/exp2/。

(3)    汇编连接,运行程序,观察结果。

(4)    提交测试。

(5)    运行结果展示: 

%include "io_linux.inc"

section .data
    table db 31H,30H,20H,7CH,20H,30H,20H,31H,20H,32H,20H,33H,20H,34H,20H,35H,20H,36H,20H,37H,20H,38H,20H,39H,20H,41H,20H,42H,20H,43H,20H,44H,20H,45H,20H,46H,0AH
         db 2DH,2DH,20H,2BH,20H,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,2DH,0AH
         db 32H,30H,20H,7CH,20H,20H,21H,20H,22H,20H,23H,20H,24H,20H,25H,20H,26H,20H,27H,20H,28H,20H,29H,20H,2AH,20H,2BH,20H,2CH,20H,2DH,20H,2EH,20H,2FH,0AH
         db 33H,30H,20H,7CH,30H,20H,31H,20H,32H,20H,33H,20H,34H,20H,35H,20H,36H,20H,37H,20H,38H,20H,39H,20H,3AH,20H,3BH,20H,3CH,20H,3DH,20H,3EH,20H,3FH,0AH
         db 34H,30H,20H,7CH,40H,20H,41H,20H,42H,20H,43H,20H,44H,20H,45H,20H,46H,20H,47H,20H,48H,20H,49H,20H,4AH,20H,4BH,20H,4CH,20H,4DH,20H,4EH,20H,4FH,0AH
         db 35H,30H,20H,7CH,50H,20H,51H,20H,52H,20H,53H,20H,54H,20H,55H,20H,56H,20H,57H,20H,58H,20H,59H,20H,5AH,20H,5BH,20H,5CH,20H,5DH,20H,5EH,20H,5FH,0AH
         db 36H,30H,20H,7CH,60H,20H,61H,20H,62H,20H,63H,20H,64H,20H,65H,20H,66H,20H,67H,20H,68H,20H,69H,20H,6AH,20H,6BH,20H,6CH,20H,6DH,20H,6EH,20H,6FH,0AH
         db 37H,30H,20H,7CH,70H,20H,71H,20H,72H,20H,73H,20H,74H,20H,75H,20H,76H,20H,77H,20H,78H,20H,79H,20H,7AH,20H,7BH,20H,7CH,20H,7DH,20H,7EH,20H,0AH
section .text
    global _start

_start:
    mov eax , table
    call dispmsg
    
    exit

Ctrl+s   //保存

nasm -f elf ./experiments/exp2/exp2_1.s

ld -m elf_i386 -o ./experiments/exp2/exp2_1 ./experiments/exp2/exp2_1.o ./lib/io_linux.a
./experiments/exp2/exp2_1

3.步骤六

  • 编写组合数据寻址示例程序的汇编语言程序

(1)    在桌面打开vscode,新建文件exp2_2.s。组合教材例2-8~例2-10的数据寻址示例程序,将其编辑成一个汇编语言源程序。

要求:利用子程序DISPRD,分别在立即数寻址程序(例2-8)、寄存器寻址程序(例2-9)和存储器直接寻址程序(例2-10)这3段程序执行后,显示8个通用寄存器的值。

提示:需要将教材例2-9和例2-10的程序修改正确,其中例2-10中传递变量使用的通用寄存器需设置为EAX
注意:由于NASM不支持TYPE等类型操作符,所以将“mov edx,const*4/type dvar”直接改为“mov edx,const*4/4”

(2)    保存文件到Desktop/ZZUassembly/ZZUNASM/experiments/exp2/。

(3)    汇编连接,运行程序,观察结果,对照程序运行的显示结果和列表文件深入理解立即数寻址、寄存器寻址和存储器直接寻址的应用。

(4)    提交测试。

​
%include "io_linux.inc"
section .data
    const equ 64
    bvar db 87H, 49H
    dvar dd 12345678H, 12

section .text
    global _start

_start:
    mov eax, 0x00006412
    mov ebx, 0x0000FFFF
    mov ecx, 0x00000040
    mov edx, 0x00000040
    lea esi, [0x08049c10]
    lea edi, [0x08048084]
    mov ebp, 0x00000000
    call disprd

    mov eax, 0x00006464
    mov ebx, 0x00006464
    mov ecx, const
    mov edx, 0x0000002B
    lea esi, [0x08049c10]
    lea edi, [0x08049c10]
    mov ebp, 0x00000000
    call disprd

    
    mov eax, 0x87654321
    mov ebx, 0x00006464
    mov ecx, 0x0000004C
    mov edx, 0x12345678
    lea esi, [0x08049c10]
    lea edi, [0x08049c10]
    mov ebp, 0x00000000
    call disprd

    
    mov eax, 1
    xor ebx, ebx
    int 0x80

​

修改完毕,感谢 @不见疏影 同学提出原代码不能满分通过并且提供修改。

Ctrl+s   //保存

nasm -f elf ./experiments/exp2/exp2_2.s

ld -m elf_i386 -o ./experiments/exp2/exp2_2 ./experiments/exp2/exp2_2.o ./lib/io_linux.a
./experiments/exp2/exp2_2

4.步骤七

  • 编写字符串复制的汇编语言程序

(1)    在桌面打开vscode,新建文件exp2_3.s。参考教材例2-11和例2-12的示例程序,编写一个字符串复制的汇编语言程序,字符串内容为“Hello! Welcome to Linux NASM!!!”。要求:在一个汇编语言源程序中,分别采用寄存器间接寻址和寄存器相对寻址两种方法实现字符传送,并通过字符串显示子程序(DISPMSG)显示出复制成功的字符串。

(2)    保存文件到Desktop/ZZUassembly/ZZUNASM/experiments/exp2/。

(3)    汇编连接,运行程序,观察结果。

(4)    提交测试。

(5)    运行结果展示:

section .data
    source db "Hello! Welcome to Linux NASM!!!",13,10, 0
    dest1 db 50 dup(0)
    dest2 db 50 dup(0)

section .bss
    buffer resb 128

section .text
    global _start

_start:
    lea esi, [source]
    lea edi, [dest1]
copy_indirect:
    lodsb
    stosb
    test al, al
    jne copy_indirect

    lea esi, [dest1]
    call get_length
    mov edx, ecx
    lea ecx, [dest1]
    call DISPMSG

    lea esi, [source]
    lea edi, [dest2]
    mov ecx, 50
copy_relative:
    mov al, [esi]
    mov [edi], al
    inc esi
    inc edi
    test al, al
    jne copy_relative

    lea esi, [dest2]
    call get_length
    mov edx, ecx
    lea ecx, [dest2]
    call DISPMSG

    mov eax, 1
    xor ebx, ebx
    int 0x80

get_length:
    mov ecx, 0
strlen_loop:
    cmp byte [esi + ecx], 0
    je strlen_done
    inc ecx
    jmp strlen_loop
strlen_done:
    ret

DISPMSG:
    pusha
    mov eax, 4
    mov ebx, 1
    int 0x80
    popa
    ret

Ctrl+s   //保存

nasm -f elf ./experiments/exp2/exp2_3.s

ld -m elf_i386 -o ./experiments/exp2/exp2_3 ./experiments/exp2/exp2_3.o ./lib/io_linux.a
./experiments/exp2/exp2_3

5.步骤8

本步骤的c语言代码:

#include <stdio.h>
int main()
{
    unsigned int x = 3987654321;
    int y=x;
    printf("%d",y);
    return 0;
}

汇编代码:

%include"io_linux.inc"
section .data
    x dd 3987654321        

section .text
    global _start           
    extern dispsid         

_start:
    mov eax, [x]           
    call dispsid           

  
    mov eax, 1             
    xor ebx, ebx           
    int 0x80

Ctrl+s   //保存

nasm -f elf ./experiments/exp1/exp1_4.s

ld -m elf_i386 -o ./experiments/exp1/exp1_4 ./experiments/exp1/exp1_4.o ./lib/io_linux.a
./experiments/exp1/exp1_4

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值