新发现:其实不用汇编连接运行,直接点提交评测就可以通过。所以把代码复制到那就可以了,直接点击提交评测。
1.实验步骤二:验证单分支结构的字母判断程序
(1) 在桌面打开vscode,新建文件exp4_1.s,将单分支结构的字母判断程序(教材例4-10)编写为完整的汇编语言源程序。
要求:基于例4-10所示源程序做出相应修改,在数据段定义大写字母“N”;然后在代码段将“N”保存到寄存器AL中,利用显示子程序DISPC将该字母显示出来;最后判断AL中的字母是否为大写字母,是的话就转换为小写字母;否则就退出程序。
(2) 保存文件到Desktop/ZZUassembly/ZZUNASM/experiments/exp4/。
(3) 汇编连接,运行程序,观察结果。
(5) 提交测试。
(6) 运行结果示例展示( 并非正确运行结果,仅作为格式展示使用):
A
a
%include"io_linux.inc"
section .data
char db 'N'
section .text
global _start
_start:
mov al,[char]
call dispc
call dispcrlf
cmp al,'A'
jb done
cmp al,'Z'
ja done
or al,20h
call dispc
call dispcrlf
done:
mov ah,4ch
int 21h
2.实验步骤三:编写单分支结构的数字判断程序
(1) 在桌面打开vscode,新建文件exp4_2.s。编写单分支结构的数字判断程序。首先在数据段按顺序定义“N”“a”“8”这三个字符,然后按照上述字符顺序,每次显示一个字符并判断这三个字符是否为数字,如果不是数字0~9,就提示错误“Error! Next One!”,如果是数字0~9,就提示“Great!!!”。
(2) 保存文件到Desktop/ZZUassembly/ZZUNASM/experiments/exp4/。
(3) 汇编连接,运行程序,观察结果。
(5) 提交测试。
(6) 运行结果展示:
N
Error! Next One!
a
Error! Next One!
8
Great!
section .data
chars db 'N', 'a', '8'
len equ $ - chars
great db 'Great!',0xA
great_len equ $ - great
error db 'Error! Next One!',0xA
error_len equ $ - error
section .text
global _start
_start:
mov esi, 0
check_loop:
cmp esi, len
jge exit
mov eax, 4
mov ebx, 1
lea ecx, [chars + esi]
mov edx, 1
int 0x80
push esi
mov eax, 4
mov ebx, 1
mov ecx, newline
mov edx, 1
int 0x80
pop esi
mov al, [chars + esi]
cmp al, '0'
jl not_digit
cmp al, '9'
jg not_digit
mov eax, 4
mov ebx, 1
mov ecx, great
mov edx, great_len
int 0x80
jmp next_char
not_digit:
mov eax, 4
mov ebx, 1
mov ecx, error
mov edx, error_len
int 0x80
next_char:
inc esi
jmp check_loop
exit:
mov eax, 1
mov ebx, 0
int 0x80
section .data
newline db 0xA
3.实验步骤四:验证双分支结构的显示数据最高位程序
(1) 在桌面打开vscode,新建文件exp4_3.s,将双分支结构的显示数据最高位程序(教材例4-11)编写为完整的汇编语言源程序。
要求:将数据最高位显示出来,最高位为0显示字符0,最高位为1显示字符1。
(2) 保存文件到Desktop/ZZUassembly/ZZUNASM/experiments/exp4/。
(3) 汇编连接,运行程序,观察结果。
(4) 提交测试。
%include"io_linux.inc"
section .data
dvar dd 80000000h
section .text
global _start
_start:
mov ebx, [dvar]
shl ebx, 1
jc one
mov al, '0'
jmp two
one:
mov al, '1'
two:
call dispc
mov eax, 1
xor ebx, ebx
int 0x80
section .bss
char resb 1
4.实验步骤五:编写双分支结构的测试高低位程序
(1) 在桌面打开vscode,新建文件exp4_4.s。仿照上一个实验,编写双分支结构的测试高低位程序(教材习题4.16)。
要求:定义双字变量DVAR为57H,测试该数据的最高位,如果为1,则显示字母“L”;如果最高位不为1,则继续测试最低位,如果最低位为1,则显示字母“R”;如果最低位也不为1,则显示字母“M”。
(2) 保存文件到Desktop/ZZUassembly/ZZUNASM/experiments/exp4/。
(3) 汇编连接,运行程序,观察结果。
(4) 提交测试。
%include "io_linux.inc"
section .data
DVAR dd 57h
section .text
global _start
_start:
mov ebx, [DVAR]
shl ebx, 1
jc display_L
mov ebx, [DVAR]
test ebx, 1
jnz display_R
mov al, 'M'
jmp display
display_L:
mov al, 'L'
jmp display
display_R:
mov al, 'R'
display:
call dispc
mov eax, 1
xor ebx, ebx
int 0x80
dispc:
mov [char], al
mov eax, 4
mov ebx, 1
mov ecx, char
mov edx, 1
int 0x80
ret
section .bss
char resb 1
5.实验步骤六:编写计算乘车时长的汇编语言程序
参考上述C语言源程序,编写汇编代码exp4_5.s。
要求:根据火车的出发时间和达到时间计算整个旅途所用的时间。
注意:出发时间、到达时间和经历时间在数据段中定义,数据格式与上述C语言程序一致。
section .data
start_time db '1200'; 出发时间
end_time db '1430';到达时间
during_time db 2 dup(0), ':', 2 dup (0),0;经过时间
section .text
global _start
_start:
XXXXXX
XXXXXX;将代码段补充完整,编写代码序列计算经历的时间,存放到during_time
mov eax,during_time
call dispmsg
c语言代码如下:
#include <stdio.h>
int main() {
int start_time, end_time, during_time;
scanf("%4d%4d", &start_time, &end_time);
start_time = start_time / 100 * 60 + start_time % 100;
end_time = end_time / 100 * 60 + end_time % 100;
during_time = end_time - start_time;
printf("%02d:%02d", during_time / 60, during_time % 60);
return 0;
}
汇编语言实验如下:
%include "io_linux.inc"
section .data
start_time db '1200'
end_time db '1430'
during_time db 2 dup(0), ':', 2 dup(0), 0
section .text
global _start
_start:
movzx eax, byte [start_time]
sub eax, '0'
imul eax, eax, 10
movzx ebx, byte [start_time+1]
sub ebx, '0'
add eax, ebx
imul eax, eax, 60
mov edi, eax
movzx eax, byte [start_time+2]
sub eax, '0'
imul eax, eax, 10
movzx ebx, byte [start_time+3]
sub ebx, '0'
add eax, ebx
add edi, eax
movzx eax, byte [end_time]
sub eax, '0'
imul eax, eax, 10
movzx ebx, byte [end_time+1]
sub ebx, '0'
add eax, ebx
imul eax, eax, 60
mov esi, eax
movzx eax, byte [end_time+2]
sub eax, '0'
imul eax, eax, 10
movzx ebx, byte [end_time+3]
sub ebx, '0'
add eax, ebx
add esi, eax
mov eax, esi
sub eax, edi
mov ebx, 60
xor edx, edx
div ebx
mov ecx, eax
mov ebx, edx
mov eax, ecx
xor edx, edx
mov edi, 10
div edi
add al, '0'
mov [during_time], al
add dl, '0'
mov [during_time+1], dl
mov eax, ebx
xor edx, edx
mov edi, 10
div edi
add al, '0'
mov [during_time+3], al
add dl, '0'
mov [during_time+4], dl
mov eax, during_time
call dispmsg
mov eax, 1
xor ebx, ebx
int 0x80