汇编——16位汇编&调试&一些练习代码

  • 编译: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

上一篇:MongoDB学习笔记:副本集


下一篇:Linux的rpm\yum\源代码软件安装