注册 登录
编程论坛 汇编论坛

[求助][讨论]小A组成大A

白居易 发布于 2007-05-29 12:11, 1228 次点击
我以前学的是C/C++,一直没接触过汇编,听朋友说汇编语言很难,学的一段时间,确实是这样。
有个小程序是这样的,题目很简单:用小A组成大A在屏幕上显示,是一家公司招聘员工的试题,希望各路高手指点迷津,本个感激不尽!
A
A A
AAAAA
A A
A A

[此贴子已经被作者于2007-5-30 15:12:29编辑过]

17 回复
#2
爱以走远2007-05-29 13:14
说真的 不懂你到底是什么意思
是不是用a组成一个A在显示出来哦
#3
CHEN53545202007-05-30 12:14
如果是小写变成大写的话,那不是简单喔!
#4
白居易2007-05-30 15:09
2楼说的对,是由许多的A组成的大A,比如这样
A
A A
AAAAA
A A
A A

[此贴子已经被作者于2007-5-30 15:11:09编辑过]

#5
菜鸟上路2007-05-30 15:19
那用C写个不是很快?
#6
白居易2007-05-30 15:20
用C的话是比较快,现在想尝试用汇编,没想到这么难!

[此贴子已经被作者于2007-5-30 15:24:44编辑过]


#7
菜鸟上路2007-05-30 17:55
写好C的汇编就容易了,只是把C翻译过来
#8
爱以走远2007-05-30 18:44
ls说得对 其实算法都是一样的
就是汇编在处理一些东西上要麻烦很多
不过这个也好写 你自己先试试吧
这样才能提高
#9
白居易2007-05-31 22:16
虽然没有给出源代码,但还是谢谢大家的关心!看来我还有很长的路要走,要加倍努力了,呵呵!
#10
sk9412007-06-01 18:13
STACK SEGMENT STACK
DB 100 DUP(?)
STACK ENDS
DATA SEGMENT
X DB ' A ',13,10
DB ' A A ',13,10
DB ' AAAAA ',13,10
DB ' A A ',13,10
DB ' A A $',13,10
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET X
MOV AH,9H
INT 21H
MOV AH,1H
INT 21H
RET
MAIN ENDP
CODE ENDS
END MAIN
貌似就是这个
#11
菜鸟上路2007-06-01 18:31
哈哈,我就知道会有人这样做的
#12
sk9412007-06-01 18:44
我们老师出过这样的题目,要求画个心型图,我直接COPY然后改过来
#13
爱以走远2007-06-01 18:52
呵呵 ls的是最简单的
不过最好还是用循环来做
#14
herbert_19872007-06-03 01:09
可以用C来写,写好后反汇编来看一下呀。
#15
herbert_19872007-06-03 01:12

转载的:(任意输入一个字符,然后输出一个大字符)

total_len equ 8*128 ;01
;****************************************8
message segment ;03資料段開始
message0 db 0dh, 0ah,'按任意鍵(Esc鍵離開):$'
char_graph db total_len dup(?)
message ends ;06 資料段結束
;*********************************************
code segment ;08 程式碼區段開始
assume cs:code, ds:message
;___________________________________________
main proc far ;11 指程式開始
start: push ds ;12 將返回DOS資訊存入堆疊
sub ax,ax
push ax

mov bx,0f000h ;16
mov cx,total_len
mov ds, bx ;18 使DS指向BIOS段位址
mov si,0fa6eh ;19 使SI指向BIOS中ASCII位元圖之偏移位址
mov ax, message
mov di, offset char_graph
mov es,ax ;22 使ES指向本程式的資料段
rep movsb ;23 搬移

mov ds, ax ;25 使DS指向本程式的資料段
nxt_char:
mov dx, offset message0
mov ah, 9
int 21h ;29
call crlf
input: mov ah, 0 ;31 輸入按鍵
int 16h
cmp al,1bh
je exit
cmp al, 07fh
ja input ;36

mov dh, al ;38 保存該鍵的ASCII於DH
mov si, offset char_graph
cbw ;40 計算該ASCII之偏移位址
mov cl, 3
shl ax, cl
add si, ax ;43 並存於SI
cld ;44 使LODSB往高位址處取得資料
mov ch, 8 ;45 每個ASCII字元圖以8位元組表示
nxt_byte:
lodsb ;47 取得該ASCII字元的其中一個位元組
mov cl, 8 ;48 每個位元組有8位元
nxt_bit:
mov dl, dh ;50 決定是要印出空白還是該字元
shl al, 1 ;51 決定方法是該位元為0則印空白
jc print ;52 反之印出該ASCII字元
mov dl,' ' ;53
print: mov ah,2 ;54
push ax ;55 為避免AL值改變,故存於堆疊
int 21h ;56 印出
pop ax ;57 取回AL值
dec cl
jnz nxt_bit ;59 是否印下一位元

call crlf ;61 否,則印出換行及歸位字元
dec ch
jnz nxt_byte ;63 是否印下一位元組
jmp nxt_char ;64 否,則跳到輸入按鍵
exit: ret ;66 返回DOS
main endp
;_____________________________________________
crlf proc near ;69
push ax
mov ah, 2
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h
pop ax
ret
crlf endp ;78
;_________________________________________________
code ends ;80
;*************************************************
stack segment stack ;82 堆疊段
dw 80 dup (?)
stack ends ;84
;*************************************************
end start ;86 指定程式進入點

#16
白居易2007-06-03 17:28

这是我编的小A变大A的C++程序,但搞不懂herbert_1987说的反汇编,还得请教大家
#define han 9
#define lie 2*han
#include<iostream>
#include<string>
using namespace std;
main()
{
int i,j,m,n,k;
i=han/2;j=lie/2;
string data[han][lie];
for(m=0;m<han;m++)
for(n=0;n<lie;n++)
{
k=m;
if(n==j-k||n==j+k||m==i&&n>j-i&&n<j+i)
{data[m][n]='A';
cout<<data[m][n];
}
else
{
data[m][n]=' ';
cout<<data[m][n];
}
if(n==lie-1)
cout<<endl;
}
}

[此贴子已经被作者于2007-6-3 17:30:42编辑过]

#17
g198710012007-06-03 23:44
个人感觉不会很难吧?  楼主不会是想拿结果的吧?  是不是就是显示字母跟排列问题? 方法应该不少. 楼上写的是什么...感觉有点乱..对么?
#18
白居易2007-06-04 22:06
这个论坛不错,有催人上进的氛围,我是加定了,楼上觉得哪里可以精简一点
1