由于程序原先实在win32位机上设计的,现在用win10需要下载dosbox 软件,设置下载好相应的debug.exe,masm.exe,link.exe就可以开始debug命令调试啦~
先熟悉debug的几个最最常用命令:
-u 反汇编显示语句指令
-t 单步调试
-d 显示内存内容
-r 显示寄存器内容
-g 运行
-q 退出
调试过程:记事本写一个汇编程序,改成.asm后缀,进入dosbox 输入 masm xx.asm 编译,link xx.obj ,debug xx.exe 就可以进入调试页面了。
第一个例题 ,汇编语言的hello world!
data segment
hello db'hello,world!',0dh,0ah,'$' ;分别是字符串,回车,换行,结束符
data ends
stack1 segment para stack ;堆栈段先设置个100防止程序溢出
dw 100 dup(?)
stack1 ends
code segment
assume cs:code,ds:data,ss:stack1
start: mov ax,data
mov ds,ax
lea dx,hello
mov ah,09h ;09h显示字符串功能
int 21h
mov ah,4ch
int 21h ;4ch结束功能
code ends
end start
第二题 将AX寄存器中的16位数分成4组,每组4位,然后将这四组数分别放在AL、BL、CL、DL中。
这道题能很好的练习四个寄存器的存储结构。
data segment
sh dw 1234h
data ends
code segment
assume cs:code,ds:data
start:
mov bx,data
mov ds,bx
mov ax,sh
mov bx,sh
mov cx,sh
mov dx,sh
and ax,000fh ;屏蔽高12位
mov cl,4 ;循环移位计数器是cx,所以送cl 4次
shr bx,cl
and bx,000fh
mov cl,8
shr cx,cl
and cx,000fh
mov cl,12
shr dx,cl
and dx,000fh
mov ah,4ch
int 21h
code ends
end start
第三题 从键盘输入一串字符,然后在下一行以相反次序显示出来
data segment
max equ 128 ;相当于 c语言的 typedef
input db max
db ? ;个数
db max dup(?) ;字符串
msg db 'Please input a string:'
clrf db 0dh,0ah,'$' ;回车换行结束符
output db 'The result is:$'
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov ah,09h ;显示msg
lea dx,msg
int 21h
mov ah,0ah ;输入字符串
lea dx,input
int 21h
mov ah,09
lea dx,clrf ;回车换行
int 21h
mov ah,09h
lea dx,output ;提示字符串
int 21h
mov ah,09
lea dx,clrf
int 21h
mov cl,input+1 ;是input+1的偏址,实际输入字符个数 ,cx是控制循环次数的.
mov ch,0
mov dl,input+1
mov dh,0
lea si,input+2 ;input+2为实际输入字符的起始地址
add si,dx ; 起始地址+个数
s0: dec si ;SI为最后一个字符的地址
mov ah,02h ;显示单个字符
mov dl,[si] ;显示dl的内容
int 21h
loop s0 ;循环在cx=0时结束了
mov ah,4ch
int 21h
code ends
end start