×
嵌入式 > 技术百科 > 详情

]“hello world”字符串输出的简单汇编

发布时间:2020-06-12 发布时间:
|
hello world这个程序是每们语言入门级新手的必经之路,下面就其汇编形式给出简短的源代码

和粗略注释。关于21号中断的作用可自行网上查阅。希望能给同学们带来帮助。

 

 

 

 

;作用:hello world! 字符串的输出

;寄存器关联:代码段code与代码段寄存器CS关联,
;数据段data与数据段寄存器DS关联。
assume CS:code,DS:data ;注意:assume是伪指令,在扫描编译时不翻译

 

;data数据段定义
data segment
  string db 'Hello world!','$' ;切忌串结束符$
data ends

 

;代码段定义
code segment

;程序开始
start:
  mov ax,data  ;将数据段段地址装入AX寄存器
  mov ds,ax ;将数据段段地址通过通用寄存器AX装入DS
  mov dx,offset string ;将串的段内地址装入DX
  mov ah,09h ;调用DOS的09H号功能,传入参数DS:DX=串地址,'$'结束字符串

  int 21h
  mov ah,4ch ;调用DOS的4CH号功能,带返回码结束,返回码存在于AL
  int 21h
code ends  ;代码段定义结束
end start  ;程序结束

 

hello world的反汇编分析:

反汇编结果如下:

-u
0C32:0000 B8310C        MOV     AX,0C31
0C32:0003 8ED8          MOV     DS,AX
0C32:0005 BA0000        MOV     DX,0000
0C32:0008 B409          MOV     AH,09
0C32:000A CD21          INT     21
0C32:000C B44C          MOV     AH,4C
0C32:000E CD21          INT     21
0C32:0010 0426          ADD     AL,26
0C32:0012 807F0403      CMP     BYTE PTR [BX+04],03
0C32:0016 7507          JNZ     001F
0C32:0018 26            ES:
0C32:0019 807F0A00      CMP     BYTE PTR [BX+0A],00
0C32:001D 7437          JZ      0056
0C32:001F A15827        MOV     AX,[2758]

单步如下:

-t

AX=0C31  BX=0000  CX=0020  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0C21  ES=0C21  SS=0C31  CS=0C32  IP=0003   NV UP EI PL NZ NA PO NC
0C32:0003 8ED8          MOV     DS,AX

由反汇编代码可以知道,数据段的段地址由OS分配得到0C31,送入AX

代码端段地址为0C32,由CS锁存。

堆栈段地址与数据段地址一样,但是SP和IP有相同的起始值,所以可能会引来一些问题。

 

继续单步:

-t

AX=0C31  BX=0000  CX=0020  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0C31  ES=0C21  SS=0C31  CS=0C32  IP=0005   NV UP EI PL NZ NA PO NC
0C32:0005 BA0000        MOV     DX,0000

AX的值已经送入DS。可以看出,一般段内地址起始值都为0.

 

单步:

0C32:0005 BA0000        MOV     DX,0000
-t

AX=0C31  BX=0000  CX=0020  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0C31  ES=0C21  SS=0C31  CS=0C32  IP=0008   NV UP EI PL NZ NA PO NC
0C32:0008 B409          MOV     AH,09

DX的值重新置为0.

 

单步:

AX=0931  BX=0000  CX=0020  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0C31  ES=0C21  SS=0C31  CS=0C32  IP=000A   NV UP EI PL NZ NA PO NC
0C32:000A CD21          INT     21

09送入AX的高八位

 

单步:

AX=0931  BX=0000  CX=0020  DX=0000  SP=FFFA  BP=0000  SI=0000  DI=0000
DS=0C31  ES=0C21  SS=0C31  CS=00A7  IP=107C  NV UP DI PL NZ NA PO NC
00A7:107C 90            NOP

引发21号中断,程序跳转

下面的都是一些中断功能,介于同学们还没有学习到,所以反汇编暂时分析到这儿。

最后看一下内存的储存情况:

-d 0c31:0
0C31:0000  48 65 6C 6C 6F 20 77 6F-72 6C 64 21 24 00 00 00   Hello world!$...
0C31:0010  B8 31 0C 8E D8 BA 00 00-B4 09 CD 21 B4 4C CD 21   .1.........!.L.!
0C31:0020  04 26 80 7F 04 03 75 07-26 80 7F 0A 00 74 37 A1   .&....u.&....t7.
0C31:0030  58 27 39 06 36 22 72 14-BE 36 22 8B 1C FF 04 2B   X'9.6"r..6"....+
0C31:0040  D8 D1 E3 D1 E3 8B 36 04-06 EB 10 90 BE 36 22 8B   ......6......6".
0C31:0050  1C FF 04 D1 E3 D1 E3 8B-36 92 12 8B 46 08 8B 56   ........6...F..V
0C31:0060  0A 89 00 89 50 02 5E 5D-C3 90 55 8B EC 83 EC 18   ....P.^]..U.....
0C31:0070  57 56 8B 5E 04 8B 07 8B-57 02 89 46 F8 89 56 FA   WV.^....W..F..V.

可以看出,我们的程序是成功的。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MC79L12ACLP的技术参数