汇编语言分析与编程实验
了解OllyDbg的基本使用方法。
实验内容
汇编书写hello world
数据段的ARY数组中存放有10个无符号数,试找出其中最大者送入MAX单元。算法分析:依次比较相邻两数的大小,将较大的送入AL中。每次比较后,较大数存放在AL中,相当于较大的数往下传。比较一共要做9次。比较结束后,AL中存放的就是最大数。
计算1+2+3+…+100 思考题,如果要将结果打印显示,该如何实现呢?
实验过程(包含实验过程中出现的问题及解决办法)
1.实验先用汇编语言在文本上编写hello world 语言再把文本名后缀改成 obj 文件 方便读入 在DEL环境中 使用 masm 指令 生成 asm 后缀的文件 在输入指令时要注意 只有在显示assembling 时才是表示成功
汇编语言如下:
在dosbox 汇编软件中 首先按照汇编指令挂载好虚拟盘d: 然后打开e:盘中的111 文件夹使用link 操作 生成了 exe 文件不断回车 然后直接打开exe 文件 输出:hello world
2.数据段的ARY数组中存放有10个无符号数,试找出其中最大者送入MAX单元
首先找到汇编代码 后缀改成 obj
汇编代码如下:
DATA SEGMENT
ARY DB 17, 5, 40, 0, 67, 12, 34, 78, 32, 10
MAX DB ?
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP (0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STACK1, DS:DATA
BEGIN: MOV AX, DATA
MOV DS, AX
MOV SI, OFFSET ARY ;SI指向ARY的第一个元素
MOV CX, 9 ;CX作循环次数计数
MOV AL, [SI] ;取第一个元素到AL
LOP: INC SI ;SI指向后一个元素
CMP AL, [SI] ;比较两个数
JAE BIGER ;前一个元素大于后一个元素时转移
MOV AL, [SI] ;取较大数到AL
BIGER: LOOP LOP ;(CX)不等于0 则转移
MOV MAX, AL
MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN
汇编代码如下 与上面的代码是一样的 方便粘贴
DATA SEGMENT
ARY DB 17, 5, 40, 0, 67, 12, 34, 78, 32, 10
MAX DB ?
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP (0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STACK1, DS:DATA
BEGIN: MOV AX, DATA
MOV DS, AX
MOV SI, OFFSET ARY ;SI指向ARY的第一个元素
MOV CX, 9 ;CX作循环次数计数
MOV AL, [SI] ;取第一个元素到AL
LOP: INC SI ;SI指向后一个元素
CMP AL, [SI] ;比较两个数
JAE BIGER ;前一个元素大于后一个元素时转移
MOV AL, [SI] ;取较大数到AL
BIGER: LOOP LOP ;(CX)不等于0 则转移
MOV MAX, AL
MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN
在改了后缀后与上部分操作一样,生成 asm 文件 在dosbox 操作 也与上一部分操作一样
使用link 操作后生成exe 文件 然后运行 但是运行后不会显示最大值 可以使用 debug 调试 使用 -t 单步调试 出现 nop
也可以 d指令 查看指定单元内容4E 表示 是78 最大值
实验 三:计算1+2+3+…+100
首先 用汇编语言 书写 操作与上一次操作相同生成文件
在dosbox 中生成相应文件 输出结果十进制 5050