Ir para conteúdo
  • Cadastre-se

fredericopissarra

Membros
  • Total de itens

    16
  • Registro em

  • Última visita

Reputação

23 Excellent

4 Seguidores

Últimos Visitantes

O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.

  1. fredericopissarra

    “Hello world” em nasm no Linux x86

    Existe outro detalhe com o uso de SYSCALL... Os Flags (quando retornados) são colocados em R11. Embora isso não seja problemático no Linux... É sempre interessante informar o modelo usado com 'bits 64' ou 'bits 32' no código. Algumas instruções são codificadas de acordo com essas diretivas. O argymento -f elf64 diz ao NASM apenas qual é o formato do arquivo ELF.
  2. fredericopissarra

    Hello world em MASM no Windows

    Eis, pra quem quiser, o manual original do MASM: https://mega.nz/#!sMdXUIqb!_1jAZzCgGcWqEdtxyxD7i9IBBSd4-bSkPM7mCifkpb4
  3. fredericopissarra

    AJuda no exercicio de C

    Nada mais simples: Potência, com o expoente natural, são apenas multiplicações sucessivas onde existe um caso especial (quando k=0): int mypow(int N, unsigned int k) { int r = 1; while (k > 0) { r *= N; k--; } return r; } Mas, existe um problema com essa função. Como 'int' tem tamanho limitado a 32 bits e admite sinal, os valores são limitados a ±2³¹ (ou de -2³¹ até 2³¹-1). Para evitar isso você pode: Usar tipos integrais com mais bits, como 'long long' ou; Usar ponto flutuante ou; Usar uma biblioteca de precisão múltipla. Note que a função original pow() usa ponto flutuante: double pow(double x, double y); O problema em usar ponto-flutuante é que ele também tem lá suas limitações... Embora os valores possam ser muito maiores, a quantidade de bits de precisão também é limitada. A melhor solução, se quiser exatidão, é usar libgmp (por exemplo): // powmp.c // // Compilar com: // cc -O2 -o powmp powmp.c -lgmp // // Não esquecer de instalar libgmp-dev. // #include <stdio.h> #include <gmp.h> int main(int argc, char *argv[]) { mpz_t r, b, e; if (argc != 3) { fputs("Usage: powmp 'base' 'expoent'\n", stderr); return 1; } mpz_init_set_ui(r, 1); // resultado. mpz_init_set_str(b, argv[1], 10); // base mpz_init_set_str(e, argv[2], 10); // expoente // Claro, isso pode ser escrito como: // r = mpz_pow(b, e); while (mpz_cmp_ui(e, 0) > 0) { mpz_mul(r, r, b); mpz_sub_ui(e, e, 1); } // Libera a memória usada pela base e expoente. mpz_clear(b); mpz_clear(e); gmp_printf("%Zd\n", r); // Libera a memória usada pelo resultado. mpz_clear(r); return 0; } Experimente compilar e depois usar: $ ./powmp 4444 4444 # 4444 elevado a 4444. 51036325037255080482040250195524395924782475482284514747828975986739479076862531615833001864027197875434172496782212810360936998814871028023280409517604289704232997250059817651452033902564981053474342143982434477010055077902971385879578097026795047013927210448069737612599735362894194645352399692361078824902286318374845566910211826792995098340076750261275207380564696757508258866109492489008027054745680387374032086494559412870696129709065543691586334825135439896393158947581127115655037247166912914512319390738590640498634195625879446208894955914635034539916382798196213477934038238442489518643389819322763837231638995434876736816619770138446121390713888522791536946903634459632202283685832172716842435855510281455739906068471774207538472233042602654906987502020125355985174905073230021003332170469140247237244791060151179276706887404173003683055711061565810462576130616749856799781002110356843640353389697516105223217210103014498528306981517615490248684606667345224474348209121691273006311131751894943803682584935085740780294725135881300910139685500678650664234655503263565369409930765042230344332922608368160388778788884646783931717914556412663681132017810017876756080237495986180628149778075630681683591162326934481582867517270565879385831508832179085202869797913623439391361789109534083973333868667373983317982638572836694588790263878531057321976457926706035794868607608000143128674258835749966110713648807550164642010195262398183937258284226451876181050405347824263231418489797089530605962873018298377904732924409245273472327709725894372282581058105524768663834139458191519630744589334410903481777861176889172389729459938914093278379923249077505369097142894400504292204972847535451294121869487522728274420380832944409608875582828867828954197345766989736271752262574052524120907677713841267414723824130389733862221839461701104193136612118363646182343780367533924798552314345440639416532935766910365326476064001062650439978986012613987836953446823328289018854743984831229989513368552344528366528946668277450956579664476698698885070608528868908111446990296036082707295422437498210126018245317186940472025919131910253989876920575814124256871659639320221224077385578352633571849429475276431189292090749302555041209922023332951651543444331299226763535432904707263476043787719983745748717480573667954495246311916624921943890202395518185431320767988580847947776915325464644299195013041220210205633708318303125892843920543505189879552980904823153381789682321967075253543745292851858094342413804502283186371602546057238458117043544418057384120943532580155301403058643552474493180342399235704855733869062287425023484735796769739544602182545742884488193642040911298424695109308187173595023672783492809262968798087358959434038837430012625131591133659217967823611347405958524526761075933856486406418498051232221083011321212500132046393237242013712920493373344264333908560825994557724645284878202710188644471617856313308716424505617800507511537779281500711830120905910660921253482993943955008380295422529597530517295272711434751373008436807762561135017027186247688032009272581704436132546155134721473880825079177160955223780677219678433502729700278074401926182830254603399513829993142929857388403374970772760874169394709868564511659882097055434991242192905557305121043626131448358657169258733625263781589882596980551044501739635559777554180414767408625727263397938235392611846506923430547435639632653715759798163299353598450502659980053847341549979536485533374417981344585777831913637495528436408273284344143251860794994623002364275788357898174586933809803529995199669549788973653323309952532823803289549965974624000722832093785514980924652516482515851200807081969699906466651892169655557373657152851157852684704918682011477489156069723781227666168420881320735023475233908968720310190825736586213239037243220048657578805360944016440781006626608828743161303712574375577649933225532651050545140041874017741023508427656767689065668130401769027151944649429611356508622419636497843616839733378873568423125359771873606835205422792731727757560994851502223732734474706040309843864498501849591435827118166412237796262100139892025690084293327010312257645197663545951270607774391829880728221106093312903241196615084223406747347511355606911250776846847504818687953378149563999211135192267588652390035544532377329198071915314030957493059007692692874887653124427108176927564311114294162352327908126401618689986841523872090872302734801513886689193125816660511991658004864418535953189435072045784455379328488152720292135875359370818523073632235999955560096920959353029918712650480503579008169962642053112282387206511169150739976823577289086369441166995256367827923437835419123223095040378846316251345016228949289846720433174619937560455378596315532968385243164693560657516484944148695965324488849710057293245594493054144125301383618793154325438553456395029494822177859020897215350982592844274046353318091605614965118200898804114383826069406964847820436615643622261068438963617832290603017594755753950537202287361798424395102761325628740511493400108171212718709005382511978898908061126898933058880219555439576974738382113216437342135362672263231535922196636242632966267617797782349620766549519091205877407003046124006500309222034053734371857085554062004840926832652467921080208750743403635646914790187985334984952875123511778001857103061245386249082763461716843192378489618317944998120036331318092652006012655130682372475987291362466779491036392406652011434125908300172201075459301413967064063793126812807083864221177194505056136652580844744952550893816626476519936322862192707218970681132239377168147183801211896926748464951769597450998551868070718635711806666915579910070198897425652999349587462404531631120464229738379300920201111657804964599629952724701542323391985340968672860060669633034275225674155618588182641024574391062865746589017549671210242135692320276909192356449001140429332424010168704728232320210929716937724676749800381376170596003069426771858245290325607901081526368109316668763096997126363181245813507244280366466648932281278126373785395043601786432763709030702050240133828986390880385273986929569720458072517096795027305471085938668807654698948015622573546046818183483574210076476424314126971168689392674121509101918246504955993884315209282001301719021966321013395976496991692142425223535087917565596507435924991158667497528161617132634459787384459450622411723302480664154065560531934085200935012479292867804537504330578796940153305865857778470211005882087304011121903516957099176167592117789488946853013045527375124867065686043038426322857813366803015786294145632248001337459688483691257344667756808810763951697589291515089178471233746391308443723682518279979337718359309060602693690330560121274254701058674348091423932473471398090502843038552335985443303218444128273168445461544525875847301549067496633454966410289829207039237131199496320982864323114758277687079589482127307018838909473086361470174425155605416098610793082610666882657741882553093188048486176434501614955495508196228299583835839675502532332523762696463804129678278859082482642272742222097523888921494943635753659083340054406237245675282501632433166910819140004835672664626254656945100198177609726761793938744998764132255609836841281231901889255720627632431524563414335794855387940638983921578668572820626365369332486298710663838352786326156749468726583817126773838140775866868854750410164553462469660109474243903272165419456237431085185448995866389189328684026079146101209558854111512784423513653846049421844315706794473017508719299331262442774780215604164214935781680800812113054855039739695535889689222983145176553378931813476808180181797746175127362657263172858532527445330795453630817313353805947445272602272859755128165350245699909282790812350142389739532001665264106145203494315060714077572377651146115787312307022512064449340241437064714428811461627661296148383624217245891852900460888364100406842157821779342842799355931512314718480199341284989806192064245013731802940320169314921465098996439607567827091299243886276832382975543758070963117789490624658461677581830470547198581652714163917981803161039869381247440996205213843179071365997185244849515709324465993580039825588779376403826196295376733980918034760186594327868964300163072070993667608137198439745894622830964670577357068140987913016472869332701745194728354414343987240775197183872184550997575711793283765248345696798544187751342612045080852628322021167977131912613038625008119849405429846694204887183172236242862288336790947712149061901220691463054655089364006898766280700111034085106069195942699996386257700056260174925237978902361628738183989737266536727656590186430086434104066899555984970430626699113393427759387535749682565485768733441976884012572940596856108887084493032729826238476610059812287841531681857742998664623258592919034850034756201558892775431988955545940511717158950554954860345959045710296346475477063086888136584311637100547898320415124284265050681611051509889545401120651624439122149764963968586574661359990455143110351913216521923238429980060786470727081816974969662410355488759308751155688931603175675838361935384326896619910401449935129538122817672871284002069273657674924148759715545901520947799114857656365404517318216715752365065243367980748870682553424957994182472477713721428412348500101323193437431770561481293771535815709700685601018988749699883796533380321551925970404211930703722814870147383043024350899076127839345055871818704915007022774623079583527294569519281380166147885655120004808523674310827725908874355002546657148457905053710323471032819923409475939303215234009696145468912877845444157428705725324269845118873307464750432702122363395708402813809266954445176416954050680390634404210721669270148110359745913179060623012183796034241442179864616637695398581278100443251513690190181608320197277957618618586103065843536903624585752721123072857484407001884695763104141852277787972331578007675974547534573051951675906287766232009077477009546299446114266148470853908985123009587555416972420221903757359950808721119718945202840731462726074950456726607369310800455523431774350442213764016387077276359397016795922323725222901757153393011002060910029626440636176239631950675089440294878401209867584496575479711689428392243002505742111285596689605354395073160765101186669200734842212683905358670429099456243262253207006194135528550831443774697840270729765763865401704965526590154726344992320309370696654772892880071351360611510079210660932423971138399311431421606107840277299308273681650706193685031204873415626123871788097831614964837590750823014964899520356299704559323275867818027880127178486971621826278303747456446269574866139129639109358738377276422155594326438226169115877710436415645241987304828870116028499639671621994432850792792265735019599993566923884747402162984414837265474645422356266002319780424780147840969885140237391862816439274529266133603892293872737639942238386916549505056622083083415928604605207659078623922547539643137607474464319868682774108046036631332560331327300717805862387838377162637617721381297418828788660000781831056361132773258934511662510049881698861900002425638322034083939517994043478227728724295818945414834121714638146161878458019249031232371077414060402468422371937149715681222275398116480010314713558625215596616468213210374517443850091715843079931522392153420229680048107366236906295197876902156234699932349027319276916186058329891573414313930428139555607919185190192389026056754929979302853958702886809773264745270796960183896245081350167326097763616039648753718725043830604194573415686556600904870474281097770232715993612793452983751496048549462024037030844508461707716072580399971349621270052737137833658105075643155272907595634443397421469710649589262478442474566724655969237120567845173418487762529440470229826695351272351294187278674957707502579670113762088486028927784199370456347878691364433162777744786870921031106518425844847931802318562143332162520586346376456214070002688736307063902638559148762788885343158956151797160107229661535733236486906762444067357474700997689101798161821428599649047752008815011514252844401816390424939585076205770589130004893645483641205584855883437744219703265734558514891267367080566267177288856805929998542256170860899494621508896364262009894660347512295257564856824890863382434289515954119435096457264634163644236916357390300378249516703332441368795061603944615807261982939505169099549073403188197221152637551597797951899683802449992409721428975183334578242666063517989340779988831472254946386047542780245023658860765336496396822462566380797706697056663267407242235449458534274651549579038743453915060277698885822973565586155765167400142931681208960899520371746560263829733583002620608328776408718158974097912755867301616673172872759418076664771180865159631798289178303532975347895035244536490025898135468963734500935569457512018474988806072324386391061095193617300563206349073421620131728842913657903246403571683953425204050878567348050563090389404172621103208845718114249781810625452672558925511250819360719595221672007862281984896444963254344123787497849024307172940520733149573313075557659925817664518441365261903347584532027572313309166188768274469438897797394969560355643211282919298080817690302382931052348206926321238904454198458118882210844822821363250357160391035907409711016857753591754468457688678088321482461731200445430768369046913591664767360089561928710085247927451471873596148752021313132678954452831023222988644694023933547158459272958964295398376115799910819417647828969677454032733360536723683214239170801207540657917395767079520734706539336317218188133109617778494291033280332817298844009428762531379612090145665038681510331917044253681161508700847119333958905296076499022356627365628010677726414340197056935602884040529960714256615145318404634297127907604465376429821155871081078665860527464878174828520506755881803641306438556538929542141958276824040748103136131211043691875023167075278822614343733796147190873169032205057260660344051067670429791992768652121913012521895059954551934047574800474904940010386563480489601958856487597748035536266648853742616961247934312465257745919735863190157531585430834131280398072320212966438382726175971311473127537745975213829044332350770984210525299185708953351516865858946612926840982398173154295235614371586316968868491360496700812212595701439490210485473139451398738165361282564989954513670435629923361237766313894962667476400381212165797730667874517027687375116051403282191571642956851650744922280646722074409834586593409233415022286762159459328347222899559242786219779579930883009193720491507988997151488555749670957360377705149503185077715180665444890518474846889711571541722584536374641569673356220830218907187400703661820710744159795145430352606015586615812921953986990749712371499322637865469171905713409497806437169004073344390361842501998570576229005993048420239096466308003448561017891340796167476073409143310036770948357403595929728871809533713636885391034647953563506410771549598669770607418612354486493048298257948324887092854280399996890575308141248091008684366391354350674635484268923258256874102915532038525363411814408562397598290284948264197305607031527537149786611423133118137166592048111327237521203819213296822190711384463234160193281284038243499433934205984075209327378314363350734284703872432542440047773545621263050059236121609644953384843066158004055268131195162416597382498798221282586951443827655466888011743230631174901668327358833149356764473022631844515870522794824314237233941605095215812377218718826428420878793242691427557719645257656471723055812922503746623901061436676816104290290411956041565447224539823415337843718907208314976358463130113654469290336305497409416174328035261292190893517872125591526291255132402239597336963894075033663474001477666944264153938660710673204098680669154124930538019930270047306104736552258986276965824647429655406555391473259064044331026222236793090208071454927204540098309770823362234251861977421278895089070563986599332469931277104734673626799143422660333436774839058609616838679119492166312585602686546299548163918419928636745017142259954187355586887636003568084241221478621695307152384094531375297756356083583426234545493926295612017618527949708463952945505173247787325422994467678743279370416826869347245921635509244741066157981696 Isso você não consegue com 'int's ou 'float's...
  4. fredericopissarra

    Ajuda com programa para verificar se palavra é palíndromo [C++]

    Não é C++, mas é C #include <stdlib.h> #include <stdio.h> #include <string.h> int main(void) { char *line, *p; size_t len, size, i; fputs("Verifica se palavra ou frase constitui um palíndromo.\n" "Algumas cossiderações são necessárias:\n\n" "\t1) Acentuação causa problemas, de acordo com o modelo de codificação.\n" "\t UTF-8, por exemplo usa 2 bytes para o caracter 'é'. Neste caso, a\n" "\t frase \"roma é amor\" NÃO será um palíndromo.\n\n" "\t2) Este programa não trata pontuação\n\n" "\t3) Também não desconsidera espaços.\n\n" "Isso implica que o palíndromo abaixo NÃO será um palíndromo:\n\n" "\t \"Luza Rocelina, a namorada do Manuel, leu na moda da Romana: Anil é cor azul\"\n\n" "Palavra/Frase: ", stdout); fflush(stdout); line = NULL; size = 0; if ((len = getline(&line, &size, stdin)) == -1) { fputs("ERRO alocando espaço para a string.\n", stderr); return 1; } if (p = strchr(line, '\n')) { *p = '\0'; len = p - line; } printf("A sentença '%s' ", line); for (i = 0; i < len / 2; i++) if (line[i] != line[len-i-1]) { fputs("NÃO ", stdout); break; } free(line); puts("é palíndromo"); return 0; } Serve assim?
  5. fredericopissarra

    Sistema engasga de tempo em tempo

    Fica muito difícil responder qualquer coisa com base no diagnóstico: "No Linux dá travadinha e no Windows não"...
  6. fredericopissarra

    Desafio de ponteiros

    Meus dois dedinhos de prosa, se é que já não explicaram isso exaustivamente ai em cima... "Ponteiro" é apenas uma variável, como qualquer outra, que contém um ENDEREÇO de memória ao invés de um valor do tipo especificado. Existe diferença entre a DECLARAÇÃO de algo e seu USO, especialmente quando se lida com "ponteiros". Abaixo, temos uma declaração de uma variável p que é um ponteiro que aponta para um char, na memória. Obviamente a variável não está inicializada (assim como você pode fazer com declarações como "int x;"): char *p; E, abaixo, temos a declaração de um array s contendo uma string e a inicialização do ponteiro p que passa a apontar para o 3º byte da string: char s[] = "Fred"; char *p; p = &s[2]; // & é o OPERADOR "endereço de"... Assim como com outros tipos de variáveis, OPERAÇÕES são efetuadas usando OPERADORES como +, -, *, /, =, etc. Só que, com ponteiros, o símbolo * é também usado como OPERADOR DE INDIREÇÃO, ou seja, ele pega o endereço no interior da variável e usa para localizar o dado referenciado por esse endereço. Quando fazemos: *p = 'a'; // usando o ponteiro inicializado acima A variável p (ponteiro p) contém o endereço (aponta para) do 3º item do array s. O * antes de p é o OPERADOR DE INDIREÇÃO que usa o endereço contido em p e pega (ou escreve, neste caso, porque temos o operador = e a expressão está do lado esquerdo) o caracter apontado. A expressão *p pega/escreve 1 caracter porque este é o tipo APONTADO pela variável p. Quando usamos operadores como +, -, ++ e -- com ponteiros trabalhamos com aritmética (duh!), mas o endereço será incrementado ou decrementado de acordo com o tamanho do tipo... Por exemplo, se fizermos: int x[] = { 1, 2, 3, 4}; int *p = &x[1]; printf("%d\n", *++p); Assumindo que p tem um endereço 0x400020 depois de inicializado, ao fazer ++p ele conterá 0x400024, ou seja, incrementamos o endereço em 4 unidades porque o tamanho de um "int" é de 4 bytes. mas note que a expressão que usei no printf() foi *++p. Isso quer dizer que fazemos um pré-incremento de p (p apontará para a posição do array x que contém o 3) e depois usamos o operador de indireção para ler o valor 3 no endereço dado por p. Neste ponto podemos responder qual é a diferença entre *p e (*p)... NENHUMA! Note que se tivéssemos uma expressão como: a = b; Faz alguma diferença se escrevessemos isso como "a = (b)"? Os parênteses ai é um operador, mas é usado apenas para forçar a ordem de precedência da expressão como um todo. Isso não significa que parensteses não possam ser usados para DECLARAR tipos diferentes de ponteiros... Por exemplo: int *a[]; // a é um array de ponteiros para int. int (*a)[]; // a é um ponteiro de arrays para int. E, às vezes, os parenteses ajudam a garantir que uma expressão faça o que queremos que ela faça... Por exemplo: c = *p++; // mesma coisa que c=*p; p=p+1; c = (*p)++; // mesma coisa que c = *p; t = *p; t = t + 1; *p = t; Aliás... não é obvio, mas ao obtermos um N-ésino item de um array a, por exemplo, via a[N], na verdade o símbolo 'a' é o ponteiro para o primeiro elemento do array que é somado ao valor N e depois "derreferenciado" (via um operador de indireção implícito)... Ou seja: a[N] == *(a + N) Isso gera um "macete" interessante, mas perigoso: a[N] também pode ser escrito como N[a] (tente, o compilador não reclamará!). Isso porque *(a + N) é a mesma coisa que *(N + a) - propriedade comutativa da adição!
  7. fredericopissarra

    Código em ASM com gcc

    Duas dicas: Para obter um código mais "enxuto", use uma opção de otimização: Recomendo -O2, porque -O3 é mais agressiva e, às vezes, causa problemas (já tive experiência em que -O3 gerou código mais "lento"!). Use -masm=intel apenas para gerar o código equivalente em assembly, evite usá-lo quando seu código tiver assembly inline. Prefira o estilo AT&T, neste caso. O motivo é que alguns header files podem implementar funções com assembly inline usando o estilo AT&T (é o caso, por exemplo, do header cpuid.h - Veja a função __get_cpuid_max, por exemplo, em /usr/lib/gcc/x86_64-linux-gnu/5/include/cpuid.h).
  8. fredericopissarra

    Endianness

    No GCC, se quiser testar pelo "endianess" para garantir que seu código funcionará corretamente (se tentar obter frações de dados maiores), pode usar: #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ ... #else ... #endif Essas são umas das muitas definições padrão do GCC, que podem ser vistas com: $ gcc -dM -E - < /dev/null | less []s Fred
  9. fredericopissarra

    Ajuda com assembly

    Um artigo que escrevi em 2016 sobre uso de assembly para desenvolvimento de aplicações completas, para Windows: "A futilidade de programar para Windows diretamente em assembly"
  10. fredericopissarra

    Ajuda com assembly

    Yep, pode-se usar a notação intel no GAS, mas não é o padrão. Sim, o NASM tem algumas pouquíssimas diferenças. Por exemplo, a pilha do fp87 não é nomeada st(n); mas st0, st1, ... st7. No mais, as instruções são as mesmas dos mnemônicos Intel. PS: MingW também tem um sistema de empacotamento, no caso do Windows, via MinGW32-setup.exe... mas eu recomento o uso do TDM-GCC para o ambiente Win64.
  11. fredericopissarra

    Keygen genérico

    É apenas um hint. O compilador tenta, sempre que possível, manter variáveis locais automáticas em registradores (especialmente com otimizações ligadas).
  12. fredericopissarra

    Ajuda com assembly

    Vejo algumas vantagens do NASM sobre o GAS: Sintaxe simplificada usando os mnemônicos oficiais da Intel, já que o GAS, por default, usa mnemônicos no estilo AT&T, onde algumas instruções foram renomeadas, como CWD, CWDE, CDQ. Ele também tem suporte melhor a códigos de 16 bits (8086) e otimizações para processadores específicos (diretiva CPU)... O NASM também suporta a geração de mais arquivos objeto do que o GAS... Em relação ao MASM, por exemplo, o NASM não possui diretivas ASSUME ou o esquisito "tipo PTR" ou "OFFSET", nem mesmo a dualidade do uso de ponteiros, como em: mov eax,var ; mesma coisa que 'mov eax,[var]' No NASM essas duas coisas são diferentes: mov eax,var ; Mesma coisa que 'mov eax,offset var', no MASM mov eax,[var] ; Mesma coisa que 'mov eax,var' ou 'mov eax,[var]', no MASM Ou seja, uma indireção deve ser cercada por [], senão estamos querendo saber o endereço do símbolo... símples e direto. Não há necessidade, também, da diretiva MODEL, já que as sessões (ou segmentos) são especificados diretamente e de forma simples (assim como no GAS). Ahhh... e MinGW não tem nada a ver com o Cygwin
  13. fredericopissarra

    Keygen genérico

    Existe um problema em usar tipos menores que 'int', neste caso. Seu processador, por default, tenta lidar com tamanhos do tipo 'int' (dwords ou 32 bits). Usar 'char' ou 'short' implica em usar varáveis menores, mas o código tende a ficar maior, porque toda referência a arrays e ponteiros depende de manipulações de "endereços" e, esses, têm 32 ou 64 bites, dependendo da arquitetura. NESTE caso específico, com as otimizações ligadas, não faz muita diferença porque o loop tem número definido de iterações (10)... De qualquer maneira, é preferível usar como contadores o tipo 'int' ou o derivado não sinalizado. PS: Mesmo no modo x86-64 o tipo 'int' é preferível. Embora neste modo os endereços tenham 48 bits de tamanho e os registradores, 64, as instruções com menores opcodes continuam sendo aquelas que manipulam os GPRs (General Purpose Registers) de 32 bits. PS2: Se for o caso de não querer se preocupar com o tamanho e sempre usar um tamanho suficientemente grande para caber contagens usadas para endereçar arrays e bufffers, prefira usar size_t (definida em stddef.h e incluída em stdlib.h e stdio.h, bem como em outros headers da libc)...
  14. fredericopissarra

    “Hello world” em nasm no Linux x86

    Notem que modifiquei o código original que postei, mostrando as chamadas SYSCALL... O NASM aceita o uso de delimitadores de string com "crases", que permite o uso de sequências de escape como \n, \r, \0, \t, ... Outra coisa... ao usar a diretiva "default rel", não precisa se preocupar com o uso do tipo de endereçamento relativo ao RIP, este torna-se o default.
  15. fredericopissarra

    “Hello world” em nasm no Linux x86

    Eu mudaria pouca coisa: Mover valores imediatos para registradores de 32 bits automaticamente zera os 32 bits superiores; Por motivoo de clareza, usar LEA ao invés de MOV para inicializar registradores com ponteiros; Offsets relativos a RIP são menores que os tradicionais; Valores constantes, incluindo strings, deveriam ser colocados em .rodata, não .data. bits 64 default rel section .rodata ; Se usar 'crase' como delimitador de strings, ; pode usar sequências de escape! Aspas, simples ; ou duplas, não fazem isso no NASM. msg: db `Hello!\n` msg_len equ $ - msg section .text global _start _start: mov eax,1 ; syscall 1: write mov edi,eax ; STDOUT_FILENO lea rsi,[msg] ; offsets relativos a RIP são menores. mov edx,msg_len syscall mov eax,60 ; syscall 60: exit xor edi,edi syscall Assim as instruções ficam pequenas (apenas LEA, acima, tem o prefixo REX).
×