汇编实验2

初步编译、链接、执行

  1. 登入 DOSBox, 挂载对应的文件夹

    mount c C:\ASM_WORK
    

    输入 \(c\)

    C:
    
  2. 汇编与链接

    MASM hello.asm
    LINK hello.obj
    
  3. 执行可执行文件

    hello.exe
    
  4. 进入 Debug 模式

    Debug hello.exe
    

任务 1

描述:将内存中字符串 “hello world” 改写成 “HELLO WORLD”,并显示修改后的结果。

  1. 反汇编 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。( DATAMASM 汇编器提供的一个特殊符号。它的作用就是代表程序数据段的起始段地址。)
  • 076C:0003 MOV DS,AX : 将数据段的地址 076A 设置到了 DS 寄存器中。
  • 076C:0005 MOV DX,0000: 对应 mov dx, OFFSET string , debug 工具不知道 string 这个符号名,所以它直接显示了 string 的偏移地址 0000
  • 得出 "Hello World!!!" 正是从 076A:0000 开始存放的。
  1. 验证地址,查看字符串内容
-D 076A:0000
  1. 修改字符串
-E 076A:0001 'HELLO WORLD!!!'
  • 这个命令会从地址 076A:0001 开始,依次写入 E, L, L, O, , W, O, R, L, D, !, !, ! 这些字符。
  1. 再次查看
-D 076A:0000

任务 2

描述:展示 3F24 + 4A2B3F24 - 4A2B 的计算

  • 这个任务是使用 DEBUG 工具自带的十六进制计算器功能
-H 3F24 4A2B
  • 结果
894F(和) F4F9 (差)

任务 3

描述: 在内存中输入 MOV AX, 50ADD AX,AX ,执行并查看 AX 的变化,修改 AX 的值为 FFFF

  • 当看到 - 提示符时,处于命令模式。在这个模式下,只能输入 debug 工具提供的内置命令,例如 A, U, D, E, G, R, Q, H 等。
  • 当输入 A (Assemble) 命令,并指定一个起始地址后,debug 会进入汇编输入模式。
  1. 转换为输入模式
  • 我们将使用 A (Assemble) 命令,从一个空闲的内存地址 (命令地址) 开始输入指令。通常选择 CS:0100 是一个安全的起始点。
  • CS 寄存器指向当前代码段的起始。0100 是一个常见的偏移地址。在 DOS 环境下,.EXE 程序加载后,其代码通常从 CS:0100 处开始执行所以,CS:0100 是一个相对安全且常用的空白区域,适合我们临时写入一些测试指令
-A CS:0100
  1. 输入命令
073F:0100 MOV AX, 50
073F:0103 ADD AX,AX
  • 回车退出输入模式
  1. 查看 AX 状态
  • 查看 AX 寄存器初始值:-R AX

  • 执行第一条指令:-T

  • 查看 AX 寄存器值:-R AX

  • 执行第二条指令:-T

  • 查看 AX 寄存器值:-R AX

  • :FFFF: 在冒号后面输入 FFFF,然后按回车 (可直接修改 AX 的值)

  • 查看 AX 寄存器值:-R AX

posted @ 2025-09-15 16:04  xqy2003  阅读(9)  评论(0)    收藏  举报