
在“未来汇编”环境中调试通过。
code segment
assume cs:code
org 100h
start:
push cs
pop ds
call inputnum
lea si,array
mov ax,[si]
sub ax,340
shl ax,1
shl ax,1
call dispnum
mov ah,4ch
int 21h
; 键盘输入数值数组子程序(数组名为array,元素个数存放在num中)
inputnum proc near
; 输入的数据以一个空格分隔,以回车符结束输入
lea di,array ;将数组第一个元素的有效地址置入DI
mov word ptr[num],0
stin:
mov ax,0
push ax
again1:
mov ah,1
int 21h
mov byte ptr[char],al
cmp al,13
je line0
cmp al,' '
je line0
sub al,30h
mov ah,0
mov si,ax
pop ax
mov cl,10
mov ch,0
mul cx
add ax,si
push ax
jmp again1
line0:
pop ax
mov word ptr[di],ax
inc word ptr[num]
cmp byte ptr[char],13
je stinend
inc di
inc di
jmp stin
stinend:
ret
array dw 100 dup(0)
num dw 0
char db
inputnum endp
; 显示十进制整型数值子程序
dispnum proc near
; 将要显示的数据放入AX中
mov dx,0
mov bx,10
div bx
mov byte ptr[y+6],dl ;保存个位
mov dx,0
div bx
mov byte ptr[y+5],dl ;保存十位
mov dx,0
div bx
mov byte ptr[y+4],dl ;保存百位
mov dx,0
div bx
mov byte ptr[y+3],dl ;保存千位
mov byte ptr[y+2],al ;保存万位
mov al,byte ptr[y+2]
add al,30h ;万位转ASC2
mov byte ptr[y+2],al
mov al,byte ptr[y+3]
add al,30h ;千位转ASC2
mov byte ptr[y+3],al
mov al,byte ptr[y+4]
add al,30h ;百位转ASC2
mov byte ptr[y+4],al
mov al,byte ptr[y+5]
add al,30h ;十位转ASC2
mov byte ptr[y+5],al
mov al,byte ptr[y+6]
add al,30h ;个位转ASC2
mov byte ptr[y+6],al
mov di,1
disp1:
inc di
cmp di,6
je dispexit
cmp byte ptr[y+di],'0'
jne dispexit
mov byte ptr[y+di],' '
jmp disp1
dispexit:
mov ah,9
lea dx,y
int 21h
ret
y db 10,13,0,0,0,0,0,'$'
dispnum endp
code ends
end start
1计算U=(X+(YZ-100))/W
其中:X,Y,Z,W均为十六位有符号数。
程序如下:
DATA
SEGMENT
X
DW
10
;16位变量
Y
DW
20
Z
DW
30
W
DW
40
U
DW
,
DATA
ENDS
CODE
SEGMENT
ASSUME
CS:CODE,DS:DATA
START:
MOV
AX,DATA
MOV
DS,AX
MOV
AX,Y
IMUL
Z
;计算YZ,内容放在DX,AX中
MOV
CX,AX
MOV
BX,DX
SUB
CX,100
;计算YZ-100
SBB
BX,
0
MOV
AX,X
CWD
;将X符号扩展,形成DX:AX中的双字
ADD
AX,CX
;计算X+(YZ-100),内容放在DX,AX中
ADC
DX,BX
IDIV
W
;计算(X+(YZ-100))/W
MOV
U,AX
MOV
U+2,DX
MOV
AH,4CH
INT
21H
CODE
ENDS
END
START
用汇编写64位程序与32位下有以下几点不同:
1,所用的寄存器不同于32下的eax,ebx,ecx,edx,esi,edi,esp,ebp等,在64位下是rax,rbx,rcx,rdx,rsi,rdi,rsp,rbp,此外又增加了r8,r9,r10,r11,r12,r13,r14,r15等寄存器。但eax,ax,ah,al等依然可用,且增加了spl,bpl等8位寄存器调用,r8等也可以用r8d,r8w,r8b进行32位,16位,8位的调用。
2,函数调用参数传递不同于32下的stdcall规范,而采用fastcall,前四个参数为别放入rcx,rdx,r8,r9四个寄存器中,并在堆栈中留出48=32个字节的空间,多于四个的参数放入堆栈。
3,函数调用后,由调用者负责堆栈回收。
看一个例子吧:
include \masm64\inc\user32inc ;头文件
includelib \masm64\lib\user32lib ;库文件
data ;定义数据段
strTittle db "Hello",0
strCaption db "How are you",0
code ;代码段
Main proc ;入口过程,需在汇编时定义
sub rsp,28H ;为前四个参数预留堆栈空间
xor rcx,rcx ;第一个参数0放入rcx中
lea rdx,strCaption ;把要显示的字符串地址做为第二个参数放入rdx中
lea r8,strTittle ;把消息框的标题字符串地址做为第三个参数放入r8中
xor r9,r9 ;把第四个参数0 放入r9中
call MessageBoxA ;调用MessageBoxA函数
add rsp,28H ;堆栈清理
ret ;返回
Main ends
end
跑马灯程序用汇编是很好实现的,只要用好循环移位指令就可以,以下是程序。
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH
LOOP:
MOV P1,A ;将控制字送端口
RL A ;控制字循环左移
LCALL DELAY ;延时
SJMP LOOP
DELAY: ;延时大概1秒
MOV R2,#10
DLY1:
MOV R3,#200
DLY2:
MOV R4,#250
DJNZ R4,$
DJNZ R3,DLY2
DJNZ R2,DLY1
RET
END
以上就是关于帮我 用汇编语言写一个程序,谢谢!全部的内容,包括:帮我 用汇编语言写一个程序,谢谢!、用汇编语言编写一个简单程序、64位程序怎么用汇编写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)