合肥工业大学汇编程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
完整代码
课 程:汇编语言程序设计
专业班级:信息安全13-1
学 号:2013211869
姓 名:马骏
实验一 Debug程序的使用
一. 实验目的
1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。 2、掌握8086/8088的寻址方式及多字节数据的处理方法。
二. 实验内容
1、利用DEBUG程序中的“E”命令,将两个多字节数“003F1AE7H”和“006BE5C4H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。 2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。 要求:
本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。
三. 实验过程和程序
实验将”12345678H”和”FEDCBA98H”分别送入起始地址为DS:200H和DS:204H的两个单元中。还包含两个附加
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
,一是从 DS:0000H 开始的 5个 16 位带符号数分别记为x,y,z,v,w,E命令初始化为:540,1,-1,1080,0, 试求w=(v-(x*y+z-540))/x,二是统计bx中1的个数
四. 实验结果(包括必要的截图)
将两个多字节数“003F1AE7H”和“006BE5C4H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。
直接寻址方式实现数据相加
寄存器间接寻址实现数据相加
附加题一:
从 DS:0000H开始的 5 个16 位带符号数分别记为 x,y,z,v,w,用 E命令初
始化为:540,1,-1,1080,0, 试求 w=(v-(x*y+z-540))/x
附加题二:完成 BX中1 的个数的统计。
五. 实验体会
通过本次实验,了解了使用debug的各种指令。同时在debug下进行编
程,比较麻烦。由于是第一次编写汇编程序,还是需要多练习。
实验二 汇编语言程序设计(顺序、循环)
一. 实验目的
1、掌握顺序和循环程序结构和设计方法;
2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。
二. 实验内容
1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成以下功能:
?计算
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达式值(V–(X*Y+Z-720))/X;
?将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。 2、求一个班50名学生成绩的平均值(附加题:最大值和最小值,并将结果显示出来)
3、从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串(附加题:查找中间是否有‘asm’子串。如果有,输出‘Yes’;否则,输出‘No’)。
三. 实验过程和程序
1、计算表达式值(V–(X*Y+Z-720))/X;
data segment
x dw 021ch
y dw 0001h
z dw 0ffffh
v dw 0438h
w dw 0000h
sum1 dw ?
sum2 dw ?
data ends
assume cs:code,ds:data
code segment
start:
mov ax,data
mov ds,ax
MOV AX,x
IMUL Y ; x*y
MOV CX, AX
MOV BX, DX
MOV AX, Z
CWD
ADD CX, AX
ADC BX, DX ; x*y+z
SUB CX, 540 ;,
SBB BX, 0 ; x*y+z-540
MOV AX, V
CWD
SUB AX, CX
SBB DX, BX ; v-(x*y+z-540)
IDIV X ; (v-(x*y+z-540))/x
mov sum1,ax
mov sum2,dx
mov ax,4c00h
int 21h
code ends
end start
2、求一个班50名学生成绩的平均值(附加题:最大值和最小值,并将结果显示
出来)
data segment
db 7,49 dup(6)
max db ?
min db ?
result db 0
data ends
assume cs:code,ds:data code segment
start: mov ax,data
mov ds,ax
mov ax,0
mov cx,50
mov di,0
again:
mov bx,0
mov bl,[di]
add di,1
add ax,bx
loop again
mov bl,50
div bl
mov result,al
mov di,50
max2:sub di,1
mov cx,50
mov si,0
mov al,[di]
max1: cmp al,[si]
jb max2
add si,1
loop max1
mov max,al
mov di,50
min2:sub di,1
mov cx,50
mov si,0
mov al,[di]
min1: cmp al,[si]
jnb min2
add si,1
loop min1
mov min,al
mov ax,4c00h
int 21h
code ends
end start
3、从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印
该字符串(附加题:查找中间是否有‘asm’子串。如果有,输出‘Yes’;否则,
输出‘No’)。
data segment
data2 db 50,?,50 dup('$') string db 'yes$'
string1 db 'no$'
data ends
assume cs:code,ds:data code segment
start: mov ax,data
mov ds,ax
mov ah,0ah
mov dx,offset data2
int 21h
mov ah,2h
mov dl,0ah
int 21h
mov ah,2h
mov dl,0dh
int 21h
mov dx,offset data2+2
mov ah,09h
int 21h
mov ah,2h
mov dl,0ah
int 21h
mov ah,2h
mov dl,0dh
int 21h
mov al,0h
mov cx,47
mov di,0
again: mov al,[di+2]
cmp al,61h
jnz next
mov al,[di+3]
cmp al,73h
jnz next
mov al,[di+4]
cmp al,6dh
jnz next
jmp yes
next: add di,1
loop again
mov dx,offset string1
mov ah,09h
int 21h
jmp endcode
yes: mov dx,offset string
mov ah,09h
int 21h
endcode: mov ax,4c00h
int 21h
code ends
end start
四. 实验结果(包括必要的截图)
1、计算表达式值(V–(X*Y+Z-720))/X;
2、求一个班50名学生成绩的平均值(附加题:最大值和最小值,并将结果显示出来)
0030地址为平均值的商 0032地址为最大值 0034地址为最小值
3、从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串(附加题:查找中间是否有‘asm’子串。如果有,输出‘Yes’;否则,输出‘No’)。
五. 实验体会
通过此次试验,了解了符号扩展指令的使用。第二程序中,以及在输出
时,输入的字符串末尾要注意加结束标志’$’,还有在输出字符串前要先输出个
回车换行,否则回车后看不到输出结果。
实验三 汇编语言子程序设计(分支、子程序)
一. 实验目的
1、掌握分支和子程序结构和设计方法;
2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。 3、通过汇编语言了解高级语言的参数传递等知识。
二. 实验内容
1、BL中的只有一位为1。编写程序测试,并输出提示信息“The X Bit is 1”,要求:地址表和转移表。
2. 编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数内存数)。要求通过堆栈(寄存器、内存)传送所有参数。
3. 实践C,Asm的转换过程。
三. 实验过程和程序
1、BL中的只有一位为1。编写程序测试,并输出提示信息“The X Bit is 1”,要求:地址表和转移表。
;bl have one 1 cout<
int main() {
_asm mov ax,0088h;
_asm
{
}
return 0; }
四. 实验结果(包括必要的截图)
1、BL中的只有一位为1。编写程序测试,并输出提示信息“The X Bit is 1”,要求:地址表和转移表。
2. 编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数内存数)。要求通过堆栈(寄存器、内存)传送所有参数。
使用堆栈: dx及0002中为f(3,-1)=1
二、使用寄存器传值 dx及0002中为f(3,-1)=1
3. 实践C,Asm的转换过程。
TITLE D:\c++ documents\huibian.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE' _TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA' _DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST' CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS' _BSS ENDS
$$SYMBOLS SEGMENT BYTE USE32 'DEBSYM' $$SYMBOLS ENDS
$$TYPES SEGMENT BYTE USE32 'DEBTYP' $$TYPES ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS' _TLS ENDS
; COMDAT _main
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE' _TEXT ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT endif
PUBLIC _main
EXTRN __chkesp:NEAR
; COMDAT _main
_TEXT SEGMENT
_main PROC NEAR ; COMDAT
; 3 : {
push ebp
mov ebp, esp
sub esp, 64 ; 00000040H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-64]
mov ecx, 16 ; 00000010H
mov eax, -858993460 ; ccccccccH
rep stosd
; 4 :
; 5 : _asm mov ax,0088h;
mov ax, 136 ; 00000088H
; 6 : _asm ; 7 : {
; 8 :
; 9 :
; 10 :
; 11 : }
; 12 :
; 13 : return 0;
xor eax, eax
; 14 : }
pop edi
pop esi
pop ebx
add esp, 64 ; 00000040H
cmpebp, esp
call __chkesp
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END
五. 实验体会
通过本次试验使我了解了如何使用地址表和转移表,以及怎样通过堆栈(寄存器、内存)传送所有参数调用子程序。最后实践了C,Asm的转换过程,使我对C和汇编有了更多的认识。
实验四 汇编语言高级编程专题
一. 实验目的
1、汇编语言宏程序设计;
2、 掌握中断服务子程序的编写。
3、 汇编语言与高级语言的混编。
二. 实验内容
1、编写一个宏,求三个数的最小数,原型为:MIN3 x,y,z,min 2、挂接1CH中断,正计时60秒后退出。要求屏幕显示0-59的秒数。 3、VC++中编写内联汇编,将字节数组的每个元素高低四位互换。
char dbyte[] = {0x34,0x45,0x56,0x67,0xaf};
三. 实验过程和程序
1、编写一个宏,求三个数的最小数,原型为:MIN3 x,y,z,min min macro x,y,z
mov ax,x
cmp ax,y
jl next ; jc 看的是cf 是当成无符号数比较的,
mov ax,y
next: cmp ax,z
jl final
mov ax,z
final: nop
endm
code segment
assume cs:code
start: min 4 -6 3
mov ax,4c00h
int 21h
code ends
end start
2、挂接1CH中断,正计时60秒后退出。要求屏幕显示0-59的秒数。 ;addres equ 1ch
data segment
pian dw ?
duan dw ?
string db 48
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
begin: mov ax,351ch
int 21h
mov pian,bx
mov duan,es
push ds
mov dx,offset myproc
mov ax,seg myproc
mov ds,ax
mov ax,251ch
int 21h
pop ds
mov cx,0
mov bx,0
next: cmp cx,1080; 60*18
jnz next
mov dx,pian
mov ax,duan
mov ds,ax
mov ax,251ch
int 21h
mov ax,4c00h
int 21h
myproc proc
sti
inc cx
inc bx
cmp bx,18
jz print
jmp over
print:
mov bl,string
cmp bl,58
jc p0
mov al,bl
sub al,48
mov ah,00h
mov dl,10
div dl
mov bl,ah
mov dl,al
add dl,48
mov ah,02h
int 21h
mov dl,bl
add dl,48
mov ah,02h
int 21h
jmp p1
p0:
mov dl,string
mov ah,02h
int 21h
p1: inc string
mov ah,02h
mov dl,0dh
int 21h
mov bx,0
; mov dl,0dh ;int 21h
over: iret
;msg:
;string db 'one second $'
myproc endp
code ends
end start
--按a键后,保留旧时间,重新另起一行开始计时 ;----使用21H 的0BH功能检查按键是否按下
data segment
pian dw ?
duan dw ?
string db 48
data ends
code segment
assume cs:code,ds:data start:
mov ax,data
mov ds,ax
mov ax,351ch
int 21h
mov pian,bx
mov duan,es
push ds
mov dx,offset myproc
mov ax,seg myproc
mov ds,ax
mov ax,251ch
int 21h
pop ds
begin: mov cx,0
mov bx,0 next: cmp cx,1080; 60*18
jnz next
mov dx,pian
mov ax,duan
mov ds,ax
mov ax,251ch
int 21h
mov ax,4c00h
int 21h
myproc proc
sti
push ax
push bx
push cx
push si
mov ah,0bh
int 21h
sub al,00h
jz ok
mov ah,07h
int 21h
cmp al,61h
jz crazy
jmp ok
crazy:
pop si
pop cx
pop bx
pop ax
mov ah,0ch;清空输入缓存区
int 21h
mov ah,02h
mov dl,0ah
int 21h
mov dl,0dh
int 21h
; jmp begin
mov cx,0
mov bx,0
mov string,48;string 清零重新计数
jmp over
ok:
pop si
pop cx
pop bx
pop ax
inc cx
inc bx
cmp bx,18
jz print
jmp over
print:
mov bl,string
cmp bl,58
jc p0
mov al,bl
sub al,48
mov ah,00h
mov dl,10
div dl
mov bl,ah
mov dl,al
add dl,48
mov ah,02h
int 21h
mov dl,bl
add dl,48
mov ah,02h
int 21h
jmp p1
p0:
mov dl,string
mov ah,02h
int 21h
p1: inc string
mov ah,02h
mov dl,0dh
int 21h
mov bx,0
; mov dl,0dh
;int 21h
over: iret
;msg:
;string db 'one second $'
myproc endp
code ends
end start
3、VC++中编写内联汇编,将字节数组的每个元素高低四位互换。
char dbyte[] = {0x34,0x45,0x56,0x67,0xaf};
#include using namespace std;
char shu[]={0x34, 0x45, 0x56, 0x67, 0xaf };
int main(){
for (int i = 0; i < 5; i++)
cout<<(int)shu[i]<<" ";
cout << endl;
_asm{mov esi,0
mov ecx,5
again:
mov dl, shu[esi]
mov eax,0
next1:
ror dl,1
inc eax
cmp eax,4
jne next1
mov shu[esi],dl
add esi,1
loop again
}
for ( i = 0; i < 5; i++)cout << (int)shu[i] << " ";
cout << endl;
return 0;
}
四. 实验结果(包括必要的截图)
1、编写一个宏,求三个数的最小数,原型为:MIN3 x,y,z,min
-59的秒数。 2、挂接1CH中断,正计时60秒后退出。要求屏幕显示0
--按a键后,保留旧时间,重新另起一行开始计时
;----使用21H 的0BH功能检查按键是否按下
3、VC++中编写内联汇编,将字节数组的每个元素高低四位互换。
char dbyte[] = {0x34,0x45,0x56,0x67,0xaf};
五. 实验体会
在时间计数试验中,按a键如果使用1号功能则会输出一个a。但使用7号功能
则是无回显过滤的字符输入,就不会再有a输出啦