急急!汇编高手请进!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急急!汇编高手请进!相关的知识,希望对你有一定的参考价值。

2、编制在屏幕上显示下述图形的程序。(要求用调用子程序和循环的方法实现)
*
***
******
*******
********
3、从键盘上接收n(可以自由输入数字的个数)个一位十进制数,将其中大于平均值的数据显示出来。
4、完成三个五位数相加,显示加数、被加数和结果
一定要用汇编的形式啊!呵呵!

1、

assume cs:code, ss:stack
option casemap :none

stack segment
db 256 dup (?)
stack ends

trangle proto stdcall :WORD, :WORD

code segment
start:
mov ax, stack
mov ss, ax
mov sp, 256

invoke trangle, 7, '*'
invoke trangle, 7, '2'

mov ax, 4c00h
int 21h

trangle proc stdcall uses ax dx si di,
@rows :WORD, @symbol :WORD
xor di, di
mov ah, 2h
mov dl, byte ptr [@symbol]

xor di, di
.while di < @rows
xor si, si
.while si <= di
int 21h
inc si
.endw
inc di

mov dl, 13
int 21h
mov dl, 10
int 21h
mov dl, byte ptr [@symbol]
.endw
ret
trangle endp

code ends
end start

2、

assume cs:code, ds:datas, ss:stack
option casemap :none

NUMVARS equ 50

datas segment
var dd NUMVARS dup (?)
cnt dd 0
sum dd 0

ave dd 0
frc dd 0

hrd dd 100
flg dw 0
szErr db 'overflow',0
szNum db 'Enter the number of variables: ',0
szEnt db 'Enter these %_ numbers, use space or enter key as delimiter:', 13,10,0
szSum db 'Sum: %_',13,10,0
szAve db 'Average: %_.%_',13,10,0
szByd db 'Beyond average: ',0
szPhd db '%_ ',0
szTmn db 'Too many numbers',13,10,0
datas ends

stack segment
db 256 dup (?)
stack ends

input proto stdcall
iout proto stdcall :DWORD
print proto c :WORD, :VARARG

code segment
start:
mov ax, datas
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 256

invoke print, offset szNum
invoke input
mov word ptr [cnt], ax

cmp word ptr [cnt], NUMVARS
jg error_too_many

invoke print, offset szEnt, cnt
xor cx, cx
xor di, di

.while cx < word ptr [cnt]
invoke input
mov word ptr var[di], ax
mov word ptr var[di+2], dx
fild sum
fiadd var[di]
fistp sum
add di, 4
inc cx
.endw

finit
fild hrd
fild sum
fidiv cnt
fist ave

fimul hrd
fprem
fistp frc

invoke print, offset szSum, sum
invoke print, offset szAve, ave, frc

invoke print, offset szByd
xor di, di
xor cx, cx

finit
.while cx < word ptr [cnt]
fild var[di]
ficomp ave
fnstsw flg
mov ax, flg
sahf
jna @F
invoke print, offset szPhd, var[di]
@@:
add di, 4
inc cx
.endw
jmp done
error_too_many:
invoke print, offset szTmn
done:
mov ax, 4c00h
int 21h

;-------------------------------
; input proc
;-------------------------------
input proc near stdcall uses di
local @in_buf[12] :BYTE,
@in_num :DWORD,
@in_ten :WORD,
@in_tmp :WORD

mov word ptr [@in_num], 0
mov word ptr [@in_num+2], 0
mov @in_ten, 10
mov @in_tmp, 0

mov ah, 1h
xor di, di

.while 1
cmp di, 11
jge @in_error
int 21h
cmp al, 13
jz @in_newline
cmp al, ' '
jz @in_done0
mov @in_buf[di], al
inc di
.endw

@in_newline:
mov ah, 2h
mov dl, 13
int 21h
mov dl, 10
int 21h

@in_done0:
dec di

finit
fnstcw @in_tmp
or @in_tmp, 0c00h
fldcw @in_tmp
fld1

.while 1
cmp di, 0
jl @in_done1
xor ax, ax
mov al, @in_buf[di]
and al, 0Fh

mov @in_tmp, ax
fild @in_tmp
fmul st, st(1)
fiadd @in_num
fistp @in_num
fimul @in_ten
dec di
.endw

@in_error:
invoke print, offset szErr

@in_done1:
mov ax, word ptr [@in_num]
mov dx, word ptr [@in_num+2]

ret
input endp

;-------------------------------
; format output
;-------------------------------
print proc near c uses ax bx dx di si,
@szFmt :WORD, @args :VARARG
mov bx, @szFmt

xor di, di
mov si, 6
mov ah, 2h

.while byte ptr [bx+di] != 0
mov dx, [bx+di]
.if dx == 5f25h
invoke iout, [bp+si]
inc di
add si, 4
.else
int 21h
.endif

inc di
.endw
ret
print endp

;-------------------------------
; integer output
;-------------------------------
iout proc near stdcall uses ax dx di,
@arg :DWORD
local rmd :WORD, tmp :WORD, buf[16] :BYTE

finit
fnstcw tmp
or tmp, 0c00h
fldcw tmp

mov tmp, 10
fild word ptr [tmp]
xor di, di

.while word ptr [@arg] || word ptr [@arg+2]
fild @arg
fild @arg
fidiv tmp
fistp @arg
fprem
fistp word ptr [rmd]
mov dl, byte ptr [rmd]
or dl, 30h
mov buf[di], dl

inc di
.endw

dec di
mov ah, 2h

.if di & 8000h
mov dl, '0'
int 21h
.else
.while 1
cmp di, 0
.break .if sign?
mov dl, buf[di]
int 21h
dec di
.endw
.endif

ret
iout endp

code ends
end start

3、

assume cs:code, ss:stack, ds:datas
option casemap :none

datas segment
num1 dd ?
num2 dd ?
num3 dd 1
szErr db 'overflow',0
szNum db 'Enter num%_: ',0
szRes db '%_ + %_ = %_',0
datas ends

stack segment
db 256 dup (?)
stack ends

m2w macro dest
mov word ptr [dest], ax
mov word ptr [dest+2], dx
endm

input proto stdcall
iout proto stdcall :DWORD
print proto c :WORD, :VARARG

code segment
start:
mov ax, datas
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 256

invoke print, offset szNum, num3
invoke input
m2w num1

mov word ptr [num3], 2

invoke print, offset szNum, num3
invoke input
m2w num2

finit
fild num1
fiadd num2
fistp num3

invoke print, offset szRes, num1, num2, num3

mov ax, 4c00h
int 21h

;-------------------------------
; input proc
;-------------------------------
input proc near stdcall uses di
local @in_buf[12] :BYTE,
@in_num :DWORD,
@in_ten :WORD,
@in_tmp :WORD

mov word ptr [@in_num], 0
mov word ptr [@in_num+2], 0
mov @in_ten, 10
mov @in_tmp, 0

mov ah, 1h
xor di, di

.while 1
cmp di, 11
jge @in_error
int 21h
cmp al, 13
jz @in_newline
cmp al, ' '
jz @in_done0
mov @in_buf[di], al
inc di
.endw

@in_newline:
mov ah, 2h
mov dl, 13
int 21h
mov dl, 10
int 21h

@in_done0:
dec di

finit
fnstcw @in_tmp
or @in_tmp, 0c00h
fldcw @in_tmp
fld1

.while 1
cmp di, 0
jl @in_done1
xor ax, ax
mov al, @in_buf[di]
and al, 0Fh

mov @in_tmp, ax
fild @in_tmp
fmul st, st(1)
fiadd @in_num
fistp @in_num
fimul @in_ten
dec di
.endw

@in_error:
invoke print, offset szErr

@in_done1:
mov ax, word ptr [@in_num]
mov dx, word ptr [@in_num+2]

ret
input endp

;-------------------------------
; format output
;-------------------------------
print proc near c uses ax bx dx di si,
@szFmt :WORD, @args :VARARG
mov bx, @szFmt

xor di, di
mov si, 6
mov ah, 2h

.while byte ptr [bx+di] != 0
mov dx, [bx+di]
.if dx == 5f25h
invoke iout, [bp+si]
inc di
add si, 4
.else
int 21h
.endif

inc di
.endw
ret
print endp

;-------------------------------
; integer output
;-------------------------------
iout proc near stdcall uses ax dx di,
@arg :DWORD
local rmd :WORD, tmp :WORD, buf[16] :BYTE

finit
fnstcw tmp
or tmp, 0c00h
fldcw tmp

mov tmp, 10
fild word ptr [tmp]
xor di, di

.while word ptr [@arg] || word ptr [@arg+2]
fild @arg
fild @arg
fidiv tmp
fistp @arg
fprem
fistp word ptr [rmd]
mov dl, byte ptr [rmd]
or dl, 30h
mov buf[di], dl

inc di
.endw

dec di
mov ah, 2h

.if di & 8000h
mov dl, '0'
int 21h
.else
.while 1
cmp di, 0
.break .if sign?
mov dl, buf[di]
int 21h
dec di
.endw
.endif

ret
iout endp

code ends
end start
参考技术A 给你个EMIALL.自己去问吧,是我班主任的,他是汇编高手.
jym@cztvu.com

c语言编程高手请进!!!急急急急。。。

#include
<stdio.h>
main()

int
num,i,t,n[5];
//先定义要输入的变量,循环变量,还有储存每位数的数组
printf("请输入:");
//这个不用说了吧!学过的都知道。
scanf("%d",&num);
for(i=0;num>0;i++)//以i为循环变量取出每一位数!这里有个技巧!就是循环结束后,i就是num

的位数!因为num有x位的话,for语句就执行x次,i也加x次!呵呵!
n[i]=num%10;
//取num的每个位的数,%的作用你也知道的了吧!就是取余数!
num=num/10;
//因为num为整形变量!所以用除法不会出现小数!

t=i;
//t等下要用来做循环变量!先把i的值赋给它!
printf("这个数是%d位数",i);//按顺序输出!这里要注意!因为现在的i是x也就是n[i]是最高位数
printf("这个数的位数的顺序为:\n);
for(;i>0;i--)
printf("%d",n[i]);
printf("这个数的位数的逆序为:\n");
for(i=0;i<t+1;i++)
//这里就同上面的了!
printf("%d",n[i]);
参考技术A 先生成一随机数k,然后生成一个随机数对ek(10的k次幂)取模。然后要求做就行了

以上是关于急急!汇编高手请进!的主要内容,如果未能解决你的问题,请参考以下文章

c语言编程高手请进!!!急急急急。。。

Linux高手请进,急急急!Linux脚本,与二进制程序的异同

急急急!50分 高手请进 阿里旺旺(阿里巴巴版本的)右下角图标不显示 自定义通知区域的设置搞不定

24c02程序 高手请进

一个C程序设计题,高手请进!

arm 汇编 指令看不太懂,高手解释下