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