fzuASM汇编编译调试
第一部分同https://jingyan.baidu.com/article/14bd256e7e4b7cbb6d2612f6.html
汇编课程编译.asm文件以及调试对应.exe
需要的东西
windows DOS(黑框)
odbg110
make32.bat以及对应的lib、include、bin
一:
代码,文件名 find_max.asm:
二:
cmd 打开黑框->
f: 进入对应硬盘->
cd xujiayu/fzuASM 进入对应放置.asm文件的位置->
make32 find_max 编译文件->
enter
三:
进入odbg110->
打开OLLYDBG.exe->
file ->
open->
find_max.exe->
打开
四:
F7或者F8调试
汇编语言实验 (一)熟悉上机环境、顺序程序设计
assembly language
1、按照老师给的汇编源程序调试程序,熟悉上机环境
题目: 设某存储区有一数组ARRAY,现要求对数组中数据分别按正数(含0)和负数的绝对值累加,并统计正数和负数的个数。累加和与统计个数分别存入SUM1、SUM2、CUNT1和CUNT2单元中。
TITLE Program count plus and minus numbers (countnum.asm)
INCLUDE Irvine32.inc
.data
ARRAY DB 12,34,56,-12,-34,-9,0,3,0,-5,3,5
DB 0AH,0FFH,4,0,77H,88H,0F0H,0BBH
COUNT EQU $-ARRAY
SUM1 DW 0 ;存正数累加和
SUM2 DW 0 ;存负数绝对值累加和
CUNT1 DB 0 ;存正数数据个数
CUNT2 DB 0 ;存负数数据个数
.code
main PROC
; (insert executable instructions here)
XOR AX,AX ;清零
XOR BX,BX ;清零
XOR DX,DX ;清零
LEA ESI,ARRAY
MOV CL,COUNT
LOP: TEST BYTE PTR [ESI],80H
JE PLUS
MOV CH,BYTE PTR [ESI] ; 求负数绝对值
NEG CH
ADD BL,CH ; 负数绝对值累加
ADC BH,0
INC DL ; 个数计数
JMP NEXT
PLUS: ADD AL,[ESI] ; 正数累加
ADC AH,0
INC DH ; 个数计数
NEXT: INC ESI
DEC CL
JNE LOP
MOV SUM1,AX ; 存结果
MOV SUM2,BX
MOV CUNT1,DH
MOV CUNT2,DL
exit ; exit to operating system
main ENDP
END main
2、上机题目:两个八位数的相加运算
内容: DAT开始的单元中存放两个八位二进制 数,两个数相加后结果存入SUM单元中。 ( SUM为十六位 )
DAT DB X1,X2 (x1,x2自己设置)
SUM DW ?
要求:熟练掌握简单的顺序程序设计方法
代码一:
INCLUDE Irvine32.inc
.data
dat db 0ffh,0eh
sum dw ?
.code
main PROC
xor ax,ax
mov al,dat
add al,dat+1
adc ah,0
mov sum,ax
exit
main ENDP
END main
代码二:
INCLUDE Irvine32.inc
.data
dat db 0ffh,0eh
sum dw ?
.code
main PROC
movzx ax,dat
movzx bx,dat+1
add ax,bx
mov sum,ax
exit
main ENDP
END main
汇编语言实验 (二)分支程序设计
1、上机题目:统计正数(负数)的个数
内容:DAT开始的单元中存放N个字节有符号数,统计正数的个数存入T0单元中;负数的个数存入T1单元中;
Dat DB X1,……,XN
T0 DB ?
T1 DB ?
要求:熟练掌握分支程序设计方法
代码一:
include irvine32.inc
.data
dat db 12h,24h,-45h,0fh,45h,-1h
count equ $-dat
t0 db ?
t1 db ?
.code
main proc
xor al,al ;t1
xor bl,bl ;t0
xor dl,dl
lea esi,dat
mov ecx,count
again: test byte ptr [esi],80h
je plus
minus: inc al
jmp next
plus: inc bl
next: inc esi
dec ecx
jnz again
mov t1,al
mov t0,bl
exit
main endp
end main
代码二:
include irvine32.inc
.data
dat db 12h,24h,-45h,0fh,45h,-1h
count equ $-dat
t0 db ?
t1 db ?
.code
main proc
mov t0,0
mov t1,0
lea esi,dat
mov ecx,count
again: test byte ptr [esi],80h
je plus
minus: inc t1
jmp next
plus: inc t0
next: add esi,type dat
sub ecx,type dat
jnz again
exit
main endp
end main
2、上机题目: 求最大数
内容:DAT开始的字单元中存放N个无符号数,求出最大数存入MAX单元中。
DAT DW X1,……,XN
MAX DW ?
要求:熟练掌握分支程序设计方法
include irvine32.inc
.data
dat dw 12h,37h,35h,47h,7h
max dw ?
count equ ($-dat)/2
.code
main proc
lea esi,dat
mov ecx,count
dec ecx
mov ax,[esi]
dec ecx
again:add esi,2
cmp ax,[esi]
ja next
mov ax,[esi]
jmp next
next:dec ecx
jnz again
mov max,ax
exit
main endp
end main
汇编语言实验 (三)循环程序设计
1、上机题目:数据查找
内容:TAB开始的字节单元中存放N个无符号数,dat单元存放一个已知数据X,现从TAB中查找是否存在数据X,如果存在,NO单元存放该数据在TAB中的序号,否则NO单元存放0FFH 。
TAB DB X1,……,XN
dat DB x
no DB ?
代码:
include irvine32.inc
.data
tab db 12h,37h,35h,47h,76h,85h,34h,34h,17h,18h,23h,44h,99h
count equ $-tab
dat db 76h
no db ?
.code
main proc
xor dl,dl
lea esi,tab
mov ecx,count
mov al,dat
again: cmp al,[esi]
jz next
add esi,type tab
inc dl
loop again
next:je found
mov no,0ffh
jmp next2
found :mov no,dl
next2:
exit
main endp
end main
2、上机题目:无符号数排序
内容:TAB开始的单元中存放N个字节无符号数,请按照从大到小排序后,存入DAT单元中。(注意:TAB数据保持不变)
TAB DB X1,……,XN
DAT DB N DUP(?)
要求:熟练掌握循环程序设计方法
代码:
include irvine32.inc
.data
tab db 12h,37h,35h,47h,76h,85h,34h,34h,17h,18h,23h,44h,99h
count equ $-tab
dat db 13 dup(?)
.code
main proc
mov ecx,count
mov ebx,0
copy1:
mov al,tab[ebx]
mov dat[ebx],al
inc ebx
loop copy1
mov ecx,count
dec ecx
again1:mov edi,ecx
mov ebx,0
again2:
mov al,dat[ebx]
cmp al,dat[ebx+1]
jae next
xchg al,dat[ebx+1]
mov dat[ebx],al
next:inc ebx
loop again2
mov ecx,edi
loop again1
exit
main endp
end main
汇编语言实验 (四)子程序设计
1、上机题目:代码转换
内容:用子程序设计的方法,分别把BUF字单元中的四位十六进制数转换为ASCII码存入MAS开始的单元中,并在终端上显示MAS开始的4个字节单元。
BUF DW X
MAS DB 4 DUP(?)
代码:
include irvine32.inc
.data
buf dw 3423h
mas db 4 dup(?)
.code
main proc
call decbin
exit
main endp
decbin proc
push esi
push eax
mov esi,0
mov ch,4h
first:
mov cl,4h
mov dx,buf
rol dx,cl
mov buf,dx
and dl,0fh
cmp dl,0ah
jl second
add dl,7
second:
add dl,30h
mov mas[esi],dl
movzx eax,mas[esi]
call writeint
call crlf
inc esi
dec ch
jne first
pop eax
pop esi
ret
decbin endp
end main
2、上机题目:键盘输入
内容:从键盘输入一串字母并保存在string开始的地址单元,要求将该字符串中的大写字母转化为小写字母后用子程序实现在终端上依次显示该串字母的ASCII码。
string db n dup(?)
要求:熟练掌握子程序设计方法,画子程序、主程序流程图
代码:
include irvine32.inc
lenth=100;A65,a97
.data
string db lenth dup(?)
prompt1 Byte "输入长度",0
prompt2 Byte "输入字符串",0
count dd 0
.code
main proc
lea edx,prompt1
call writestring
call readint
mov count,eax
lea edx,prompt2
call writestring
mov ecx,count
lea edx,string
call readstring
call change
lea edx,string
call writestring
lea edx,string
XOR EAX,EAX
MOV ESI,0
MOV ECX,COUNT
CYCLEL:MOVZX EAX,STRING[ESI]
INC ESI
CALL WRITEINT
CALL CRLF
LOOP CYCLEL
exit
main endp
change proc
push eax
push edx
push ecx
push esi
xor eax,eax
mov esi,0
mov ecx,count
again:
mov al,string[esi]
cmp al,61h
jnb min
add al,20h
mov string[esi],al
min: inc esi
loop again
pop esi
pop ecx
pop edx
pop eax
ret
change endp
end main
汇编语言实验 (五)综合程序设计
1、上机题目:将从键盘输入的N个无符号数保存到数组DAT ,找出N个无符号数中的偶数存放到数组P,统计并在终端上显示数组P的数据个数no。
DAT DW X1,……,XN
P DW n dup (?)
no DW ?
代码:
include irvine32.inc
lenth=4;伪操作
.data
dat dw lenth dup(?)
p dw lenth dup(?)
no dw 0
count dd ?
st1 byte "输入长度",0
prompt2 byte "输入无符号数",0
prompt3 BYTE "偶数个数",0
.code
main proc
lea edx,st1
call writestring
call readint
mov count,eax
lea edx,prompt2
call writestring
mov ecx,count
mov esi,0
readin:
call readint
mov dat[esi],ax
add esi,type dat
loop readin
call evencc
lea edx,prompt3
call writestring
mov ax,no
call writeint
call crlf
exit
main endp
evencc proc
push eax
push ecx
push esi
push edi
xor eax,eax
mov esi,0
mov edi,0
mov ecx,count
ecount:
mov ax,dat[esi]
and al,1
cmp al,0
jne odd
mov ax,dat[esi]
mov p[di],ax
add di,type p
inc no
odd:
add esi,type dat
loop ecount
pop edi
pop esi
pop ecx
pop eax
ret
evencc endp
end main
2、上机题目:将从键盘输入的N个有符号数保存到数组TAB ,找出N个有符号数中绝对值大于X的最小负奇数存放到Min单元,如果没有找到则Min单元存放0。在终端上显示Min的绝对值。
TAB DD X1,……,XN
X DD xx(无符号数,自己设定)
Min DD ?
代码:
include irvine32.inc
lenth=4;伪操作
.data
tab dd lenth dup(?)
x dd lenth dup(?)
min dd ?
count dd ?
xs1 byte "输入几个有符号数",0
xs2 byte "输入要比较的数",0
xs3 byte "输入有符号数",0
xs4 BYTE "min:",0
.code
main proc
lea edx,xs1
call writestring
call readint
mov count,eax
mov ecx,count
lea edx,xs2
call writestring
call readint
mov x,eax
lea edx,xs3
call writestring
mov esi,0
readin:
call readint
mov tab[esi],eax
add esi,type tab
loop readin
call findmin
lea edx,xs4
call writestring
mov eax,min
neg eax
call writeint
call crlf
exit
main endp
findmin proc
push eax
push ecx
push esi
push edi
mov ecx,count
mov esi,0
mov min,0;还未有数比较,显然还不存在符合条件的
again:
mov eax,tab[esi]
cmp eax,0
jnl next;正数或零不符合条件,下一个
and al,1
cmp al,0
je next ;偶数不符合条件,下一个
mov eax,tab[esi]
neg eax
cmp eax,x
jna next ;绝对值不大于x不符合条件,下一个
neg eax
cmp eax,min;比较当前与原存放哪个负数更小
jnl next ;原存放更小,不需替换存在,下一个
mov min,eax
next:
add esi,type tab
loop again
pop edi
pop esi
pop ecx
pop eax
ret
findmin endp
end main
汇编语言考试A1
date:2015/05/07/8:20-10:00
大致内容:
子程序一:随机产生10个0~99的数;
子程序二:求其平均数ave,并分别统计个数大于gnum、等于enum、小于lnum;
子程序三:输出;
试卷上有给出生成随机数的使用;
我写的
子程序一:pingjun
子程序二:pito
子程序三:shuchu
(ps:在考试纸上写代码的时候,整个手都在抖。流程图也画得歪歪扭扭。超时1分钟猜弄完 )
代码:
include irvine32.inc
.data
array dd 10 dup(?)
count equ ($-array)/type array
ave dd ?
gnum dd ?
enum dd ?
lnum dd ?
.code
main proc
call pingjun
call pito
call shuchu
exit
main endp
shuchu proc
push eax
push ecx
push esi
mov ecx,count
mov esi,0
xun:
mov eax,array[esi]
call writeint
add esi,type array
loop xun
call crlf
mov eax,ave
call writeint
call crlf
mov eax,gnum
call writeint
call crlf
mov eax,enum
call writeint
call crlf
mov eax,lnum
call writeint
call crlf
pop esi
pop ecx
pop eax
ret
shuchu endp
pingjun proc
push eax
push ecx
push esi
mov esi,0
mov ecx,count
rando:
mov eax,100
call RandomRange
mov array[esi],eax
add esi,type array
loop rando
pop esi
pop ecx
pop eax
ret
pingjun endp
pito proc
push eax
push ecx
push edx
push esi
mov ecx,count
mov esi,0
mov ave,0
cly:
mov eax,array[esi]
add ave,eax
add esi,type array
loop cly
mov edx,0 ;这个地方我一开始用xor edx,0,因为xor清零应该xor edx,edx
mov eax,ave
mov ebx,count
div ebx
mov ave,eax
mov esi,0
mov gnum,0
mov enum,0
mov lnum,0
mov ecx,count
bijiao:
cmp eax,array[esi]
jna nextcmp;如果后面的>=平均数,下一次比较
inc lnum
jmp next
nextcmp:
cmp eax,array[esi]
je ienum ;如果后面的=平均数,跳到incenum
inc gnum
jmp next
ienum:
inc enum
next:
add esi,type array
loop bijiao
pop esi
pop edx
pop ecx
pop eax
ret
pito endp
end main