- 编译:ml 1.asm
- 调试:debug 1.exe
- 调试命令:
r 查看当前位置代码;p 单步步过;t 单步步入;u 查看附近代码
d 0b3b 查看0b3b位置内存;g 运行程序 - 16位汇编代码基本结构
assume cs:code,ds:data
data segment
buffer db 'xxxx$'
data ends
code segment
rkmain proc
mov ax,data
mov ds,ax
mov dx,offset buffer
mov ah,09H
int 21H
mov ah,07H
int 21H
mov ax,4c00H
int 21H
rkmain endp
start:call rkmain
code ends
end start
-
16位汇编声明字符串
buffer db 0DH,0AH, xxxxx$'
这里db是define byte的缩写,意为buffer变量定义为一字节长度
0ah和0dh组合起来是换行的意思,$经常时字符串的结束标记 -
段寄存器的赋值
必须通过通用寄存器。
若使用mov ax,data是立即数寻址方式,而立即数是不允许直接送段寄存器的。所以需要通过先送立即数到寄存器,再从寄存器到段寄存器,即mov ax,data mov ds,ax
-
offset
回送变量或标号的偏移地址值,功能和lea指令类似,效率更高一些 -
DOS的0AH号功能调用
比如在数据段有如下定义:
buff db 5,0,5 dup(0)
这里的5表示字符串最大长度为5个字符;0占用的那个字节在调用结束后会被放入实际输入的字符个数;5 dup(0)开辟5个字节单元,存放输入的字符的ASCII码。
在代码段用下面的指令进行调用:
lea dx,buff
mov ah,0ah
int 21h
运行时输入“ABC”
则调用结束后,内存的buff单元的内容应该是:05H,03H,41H,42H,43H,00H,00H