汇编实验2
初步编译、链接、执行
-
登入
DOSBox
, 挂载对应的文件夹mount c C:\ASM_WORK
输入 \(c\) 盘
C:
-
汇编与链接
MASM hello.asm LINK hello.obj
-
执行可执行文件
hello.exe
-
进入
Debug
模式Debug hello.exe
任务 1
描述:将内存中字符串 “hello world”
改写成 “HELLO WORLD”
,并显示修改后的结果。
- 反汇编
U
| 076C:0000 | BBGA07 | MOU | AX, 076A |
| 076C:0003 | 8EDB | MOU | DS,AX |
| 076C:0005 | BA0000 | MOU | DX,0000 |
| 076C:0008 | B409 | MDU | AH,09 |
| 076C:000A | CD21 | INT | 21 |
| 076C:000C | B44C | MDU | AH, 4C |
| 076C:000E | CD21 | INT | 21 |
| 076C:0010 | 56 | PUSH | SI |
| 076C:0011 | D03B | SAR | BYTE PTR [BP+DI],1 |
| 076C:0013 | 56 | PUSH | SI |
| 076C:0014 | 1A7503 | SBB | DH, [DI+03] |
| 076C:0017 | 384618 | CMP | AX, [BP+18] |
| 076C:001A | 7606 | JBE | 0022 |
| 076C:001C | 894618 | MOU | [BP+18], AX |
| 076C:001F | 89561A | MDU | [BP+1A], DX |
与源代码对比
data segment
string DB 'Hello World!!!', 0AH, 0DH, '$'
data ends
code segment
assume cs:code, ds:data
start:
MOV AX, DATA
MOV DS, AX
mov dx, OFFSET string
mov AH, 09H
int 21H
MOV AH, 4CH
INT 21H
code ends
end start
076C:0000 MOV AX,076A
: 意为着数据段的段地址是076A
。(DATA
是MASM
汇编器提供的一个特殊符号。它的作用就是代表程序数据段的起始段地址。)076C:0003 MOV DS,AX
: 将数据段的地址076A
设置到了DS
寄存器中。076C:0005 MOV DX,0000
: 对应mov dx, OFFSET string
,debug
工具不知道string
这个符号名,所以它直接显示了string
的偏移地址0000
。- 得出
"Hello World!!!"
正是从076A:0000
开始存放的。
- 验证地址,查看字符串内容
-D 076A:0000
- 修改字符串
-E 076A:0001 'HELLO WORLD!!!'
- 这个命令会从地址
076A:0001
开始,依次写入E, L, L, O, , W, O, R, L, D, !, !, !
这些字符。
- 再次查看
-D 076A:0000
任务 2
描述:展示 3F24 + 4A2B
和 3F24 - 4A2B
的计算
- 这个任务是使用
DEBUG
工具自带的十六进制计算器功能
-H 3F24 4A2B
- 结果
894F(和) F4F9 (差)
任务 3
描述: 在内存中输入 MOV AX, 50
和 ADD AX,AX
,执行并查看 AX
的变化,修改 AX
的值为 FFFF
- 当看到
-
提示符时,处于命令模式。在这个模式下,只能输入debug
工具提供的内置命令,例如A, U, D, E, G, R, Q, H
等。 - 当输入
A (Assemble)
命令,并指定一个起始地址后,debug
会进入汇编输入模式。
- 转换为输入模式
- 我们将使用
A (Assemble)
命令,从一个空闲的内存地址 (命令地址) 开始输入指令。通常选择CS:0100
是一个安全的起始点。 CS
寄存器指向当前代码段的起始。0100
是一个常见的偏移地址。在DOS
环境下,.EXE
程序加载后,其代码通常从CS:0100
处开始执行所以,CS:0100
是一个相对安全且常用的空白区域,适合我们临时写入一些测试指令
-A CS:0100
- 输入命令
073F:0100 MOV AX, 50
073F:0103 ADD AX,AX
- 回车退出输入模式
- 查看
AX
状态
-
查看
AX
寄存器初始值:-R AX
-
执行第一条指令:
-T
-
查看
AX
寄存器值:-R AX
-
执行第二条指令:
-T
-
查看
AX
寄存器值:-R AX
-
:FFFF
: 在冒号后面输入 FFFF,然后按回车 (可直接修改AX
的值) -
查看
AX
寄存器值:-R AX