帮我 用汇编语言写一个程序,谢谢!

帮我 用汇编语言写一个程序,谢谢!,第1张

在“未来汇编”环境中调试通过。

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位程序怎么用汇编写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9494028.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存